Add telnet file with support to send and receive text from Merc MUD
[midgaard_bot.git] / telegram.go
1 /*
2 midgaard_bot, a Telegram bot which sets a bridge to Midgaard Merc MUD
3 Copyright (C) 2017 by Javier Sancho Fernandez <jsf at jsancho dot org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package main
20
21 import (
22         "context"
23         "log"
24
25         "github.com/go-telegram-bot-api/telegram-bot-api"
26 )
27
28 var sendChannel chan tgbotapi.Chattable
29
30 func initTelegramWorkers(token string, ctx context.Context) error {
31         bot, err := tgbotapi.NewBotAPI(token)
32         if err != nil {
33                 return err
34         }
35
36         bot.Debug = true
37
38         log.Printf("Authorized on account %s", bot.Self.UserName)
39
40         sendChannel = make(chan tgbotapi.Chattable)
41         go sendWorker(bot, sendChannel, ctx)
42         go recvWorker(bot, ctx)
43
44         return nil
45 }
46         
47 func recvWorker(bot *tgbotapi.BotAPI, ctx context.Context) {
48         u := tgbotapi.NewUpdate(0)
49         u.Timeout = 60
50
51         updates, _ := bot.GetUpdatesChan(u)
52
53         for {
54                 select {
55                 case update := <-updates:
56                         session := getSession(update.Message.Chat)
57                         sendToSession(session, update.Message)
58                 case <-ctx.Done():
59                         return
60                 }
61         }
62 }
63
64 func sendWorker(bot *tgbotapi.BotAPI, sendChannel chan tgbotapi.Chattable, ctx context.Context) {
65         for {
66                 select {
67                 case msg := <-sendChannel:
68                         bot.Send(msg)
69                 case <-ctx.Done():
70                         return
71                 }
72         }
73 }
74
75 func sendToTelegram(message tgbotapi.Chattable) {
76         sendChannel <- message
77 }