diff --git a/main.go b/main.go index 47448b0..fcaca95 100644 --- a/main.go +++ b/main.go @@ -12,7 +12,7 @@ import ( log "github.com/sirupsen/logrus" ) -// init производит некоторую инициализацию перед запуском main() +// init производит некоторую инициализацию перед запуском main(). func init() { log.SetFormatter(&log.TextFormatter{ DisableQuote: true, @@ -75,7 +75,7 @@ func main() { // Main context var ctx = context.Background() - // Откроем лог и скормим его логгеру + // Откроем лог и скормим его логгеру. if config.Log != "" { logfile, err := os.OpenFile(config.Log, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) @@ -86,7 +86,7 @@ func main() { log.SetOutput(logfile) } - // Иницализируем redis-клиента + // Инициализируем redis-клиента redisClient = redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%d", config.Redis.Server, config.Redis.Port), }) @@ -97,13 +97,14 @@ func main() { // telego init here - // Самое время поставить траппер сигналов + // Самое время поставить траппер сигналов. signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go sigHandler() + go telega(config) // Обработчик событий от редиски for msg := range redisMsgChan { diff --git a/msg-parsers.go b/msg-parsers.go index a3b8343..75be0c6 100644 --- a/msg-parsers.go +++ b/msg-parsers.go @@ -75,8 +75,8 @@ func redisMsgParser(msg string) { j.Misc.Fwdcnt = 1 } - // j.Misc.GoodMorning может быть быть 1 или 0, по-умолчанию 0 - // j.Misc.MsgFormat может быть быть 1 или 0, по-умолчанию 0 + // j.Misc.GoodMorning может быть 1 или 0, по-умолчанию 0 + // j.Misc.MsgFormat может быть 1 или 0, по-умолчанию 0 // j.Misc.Username можно не передавать, тогда будет пустая строка // Отвалидировались, теперь вернёмся к нашим баранам. @@ -92,9 +92,11 @@ func redisMsgParser(msg string) { resp, err := tg.SendMessage(j.Message, chatid, opts) - if err != nil { + if err != nil || !resp.Ok { // TODO: поддержать миграцию группы в супергруппу, поддержать вариант, когда бот замьючен. - // Красиво оформить ошибку, сполями итд, как tracedump, только ошибка. + // Красиво оформить ошибку, с полями итд, как tracedump, только ошибка. + // N.B. тут может быть сообщение о том, что группа превратилась в супергруппу, или что бот не имеет прав писать + // сообщения в чятик. Это надо бы отслеживать и хэндлить. log.Errorf("Unable to send message to telegram api: %s", err) log.Errorf("Response dump: %s", spew.Sdump(resp)) } @@ -109,6 +111,43 @@ func telegramMsgParser(msg *echotron.Update) { return } + // Сообщение о том, что этот чятик изменился, например превратился в супергруппу. + if msg.Message.MigrateFromChatID < 0 && msg.Message.MigrateToChatID < 0 { + // TODO: поддержать миграцию настроек чата га новый chatId. + // TODO: подумать, что можно сделать с настройками бэкэндов. Кажись, ничего, но надо глянуть. + } + + // Люди пришли в чят. + if msg.Message.NewChatMembers != nil { + // TODO: проверить, надо ли приветсвовать, выбрать одну из приветственных фраз, потянуть время, типа, мы пишем + // текст и поприветсвовать вновьприбывшего + } + + // Человек ушёл из чата. + if msg.Message.LeftChatMember != nil { + // TODO: проверить, надо ли прощаться с ушедшим участником чата и попрощаться, если надо + } + + switch msg.Message.Chat.Type { + case "private": + // handle private messages + // всегда ставим флажок, что надо отвечать. + // если фраза является командой - засылаем её в парсер команд + // Засылаем фразу в misc-канал (в роутер) + case "group", "supergroup": + // handle public (super)group messages + // Здесь работает цензор, если он включён. + // Здесь же, если человек ответил на авто-приветствие, это надо обнаруживать и пропускать. + // Здесь же, если фраза менее 3-х букв, просто игнорируем её + // Здесь же, если фраза является командой - засылаем её в парсер команд + // Здесь же, если фраза обращена к боту (ник или имя), выставляем флажок, что надо ответить + // Здесь же, пытаемся убрать из фразы ник или имя бота + // Засылаем фразу в misc-канал (в роутер) + case "channel": + // Тут мы ничего сделать не можем + + } + return }