|
|
@ -8,13 +8,24 @@ import ( |
|
|
|
"flag" |
|
|
|
"fmt" |
|
|
|
"io" |
|
|
|
"io/ioutil" |
|
|
|
"net" |
|
|
|
"os" |
|
|
|
"strconv" |
|
|
|
"sync" |
|
|
|
"time" |
|
|
|
|
|
|
|
"gopkg.in/yaml.v2" |
|
|
|
) |
|
|
|
|
|
|
|
type Conf struct { |
|
|
|
Port uint `yaml:"port,omitempty"` |
|
|
|
Mailer struct { |
|
|
|
ApiKey string `yaml:"api_key,omitempty"` |
|
|
|
From string `yaml:"from,omitempty"` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
type bufferedConn struct { |
|
|
|
r *bufio.Reader |
|
|
|
rout io.Reader |
|
|
@ -61,6 +72,13 @@ func usage() { |
|
|
|
} |
|
|
|
|
|
|
|
func handleRaw(conn bufferedConn) { |
|
|
|
// TODO
|
|
|
|
// What happens if this is being read from range
|
|
|
|
// when it's being added here (data race)?
|
|
|
|
// Should I use a channel here instead?
|
|
|
|
// TODO see https://jameshfisher.com/2017/04/18/golang-tcp-server.html
|
|
|
|
myRawConns[conn] = true |
|
|
|
|
|
|
|
// Handle all subsequent packets
|
|
|
|
buf := make([]byte, 1024) |
|
|
|
for { |
|
|
@ -179,16 +197,35 @@ func handleConnection(conn net.Conn) { |
|
|
|
} |
|
|
|
|
|
|
|
func main() { |
|
|
|
flag.Usage = usage |
|
|
|
port := flag.Uint("telnet-port", 0, "tcp telnet chat port") |
|
|
|
confname := flag.String("config", "./config.yml", "ymal config file") |
|
|
|
flag.Parse() |
|
|
|
|
|
|
|
var config Conf |
|
|
|
confstr, err := ioutil.ReadFile(*confname) |
|
|
|
fmt.Fprintf(os.Stdout, "-config=%s\n", *confname) |
|
|
|
if nil != err { |
|
|
|
fmt.Fprintf(os.Stderr, "%s\nUsing defaults instead\n", err) |
|
|
|
confstr = []byte("{\"port\":" + strconv.Itoa(int(*port)) + "}") |
|
|
|
} |
|
|
|
err = yaml.Unmarshal(confstr, &config) |
|
|
|
if nil != err { |
|
|
|
config = Conf{} |
|
|
|
} |
|
|
|
|
|
|
|
firstMsgs = make(chan myMsg, 128) |
|
|
|
myMsgs = make(chan myMsg, 128) |
|
|
|
newConns = make(chan net.Conn, 128) |
|
|
|
myRawConns = make(map[net.Conn]bool) |
|
|
|
myUnsortedConns = make(map[net.Conn]bool) |
|
|
|
flag.Usage = usage |
|
|
|
port:= flag.Uint("telnet-port", 4080, "tcp telnet chat port") |
|
|
|
flag.Parse() |
|
|
|
addr := ":" + strconv.Itoa(int(*port)) |
|
|
|
|
|
|
|
var addr string |
|
|
|
if 0 != int(*port) { |
|
|
|
addr = ":" + strconv.Itoa(int(*port)) |
|
|
|
} else { |
|
|
|
addr = ":" + strconv.Itoa(int(config.Port)) |
|
|
|
} |
|
|
|
|
|
|
|
// https://golang.org/pkg/net/#Conn
|
|
|
|
sock, err := net.Listen("tcp", addr) |
|
|
@ -213,6 +250,8 @@ func main() { |
|
|
|
for { |
|
|
|
select { |
|
|
|
case conn := <- newConns: |
|
|
|
ts := time.Now() |
|
|
|
fmt.Fprintf(os.Stdout, "[Handle New Connection] [Timestamp] %s\n", ts) |
|
|
|
go handleConnection(conn) |
|
|
|
case msg := <- myMsgs: |
|
|
|
ts, err := msg.receivedAt.MarshalJSON() |
|
|
|