From 8b9084ec0666ee2560545e6598f1e4eae62e1bad Mon Sep 17 00:00:00 2001 From: Hamcha Date: Mon, 8 Feb 2016 13:47:10 +0000 Subject: [PATCH] First commit --- Makefile | 4 +++ broker/action.go | 9 +++++++ broker/clients.go | 67 ++++++++++++++++++++++++++++++++++++++++++++++ broker/main.go | 43 +++++++++++++++++++++++++++++ config.json.sample | 3 +++ tg/command.go | 4 +++ 6 files changed, 130 insertions(+) create mode 100644 Makefile create mode 100644 broker/action.go create mode 100644 broker/clients.go create mode 100644 broker/main.go create mode 100644 config.json.sample create mode 100644 tg/command.go diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5de013a --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +all: broker + +broker: + go build -o clessy-broker ./broker \ No newline at end of file diff --git a/broker/action.go b/broker/action.go new file mode 100644 index 0000000..b230044 --- /dev/null +++ b/broker/action.go @@ -0,0 +1,9 @@ +package broker + +import ( + "../tg" +) + +func executeClientCommand(action tg.ClientCommand) { + +} diff --git a/broker/clients.go b/broker/clients.go new file mode 100644 index 0000000..39fba51 --- /dev/null +++ b/broker/clients.go @@ -0,0 +1,67 @@ +package main + +import ( + "bufio" + "encoding/json" + "fmt" + "log" + "net" + + "../tg" +) + +var clients []net.Conn + +func startClientsServer(bind string) { + listener, err := net.Listen("tcp", bind) + assert(err) + + // Accept loop + for { + c, err := listener.Accept() + if err != nil { + log.Printf("Can't accept client: %s\n", err.Error()) + continue + } + clients = append(clients, c) + go handleClient(c) + } +} + +func handleClient(c net.Conn) { + b := bufio.NewReader(c) + defer c.Close() + + // Start reading messages + for { + bytes, _, err := b.ReadLine() + if err != nil { + break + } + var cmd tg.ClientCommand + err = json.Unmarshal(bytes, &cmd) + if err != nil { + log.Printf("Can't parse JSON: %s\r\n", err.Error()) + continue + } + executeClientCommand(cmd) + } + removeCon(c) +} + +func removeCon(c net.Conn) { + for i, con := range Clients { + if c == con { + clients = append(clients[:i], clients[i+1:]...) + } + } +} + +func broadcast(message string) { + for _, c := range clients { + _, err := fmt.Fprintf(c, message+"\r\n") + if err != nil { + removeCon(c) + } + } +} diff --git a/broker/main.go b/broker/main.go new file mode 100644 index 0000000..8697b1e --- /dev/null +++ b/broker/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "encoding/json" + "flag" + "net/http" + "os" +) + +type Config struct { + BindServer string /* Address:Port to bind for Telegram */ + BindClients string /* Address:Port to bind for clients */ + Token string /* Telegram bot token */ + WebhookURL string /* Webhook URL */ +} + +func assert(err error) { + if err != nil { + panic(err) + } +} + +func main() { + cfgpath := flag.String("config", "config.json", "Path to configuration file") + flag.Parse() + + file, err := os.Open(*cfgpath) + assert(err) + + var config Config + err = json.NewDecoder(file).Decode(&config) + assert(err) + + // Setup webhook handler + go func() { + http.HandlerFunc(config.Token, webhook) + err := http.ListenAndServe(config.BindServer, nil) + assert(err) + }() + + // Create server for clients + startClientsServer(config.BindClients) +} diff --git a/config.json.sample b/config.json.sample new file mode 100644 index 0000000..4eb7c3f --- /dev/null +++ b/config.json.sample @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/tg/command.go b/tg/command.go new file mode 100644 index 0000000..638a279 --- /dev/null +++ b/tg/command.go @@ -0,0 +1,4 @@ +package tg + +type ClientCommand struct { +}