diff --git a/aleesa-misc-lib.go b/aleesa-misc-lib.go index fbd41ab..f53d0f2 100644 --- a/aleesa-misc-lib.go +++ b/aleesa-misc-lib.go @@ -1,259 +1,16 @@ package main import ( - "context" "encoding/json" "fmt" "os" "path/filepath" - "strings" "syscall" "github.com/hjson/hjson-go" log "github.com/sirupsen/logrus" ) -// msgParser горутинка, которая парсит json-чики прилетевшие из REDIS-ки. -func msgParser(ctx context.Context, msg string) { - var ( - sendTo = "craniac" - j rMsg - ) - - log.Debugf("Incomming raw json: %s", msg) - - if err := json.Unmarshal([]byte(msg), &j); err != nil { - log.Warnf("Unable to to parse message from redis channel: %s", err) - - return - } - - // Validate our j. - if exist := j.From; exist == "" { - log.Warnf("Incorrect msg from redis, no from field: %s", msg) - - return - } - - if exist := j.Chatid; exist == "" { - log.Warnf("Incorrect msg from redis, no chatid field: %s", msg) - - return - } - - if exist := j.Userid; exist == "" { - log.Warnf("Incorrect msg from redis, no userid field: %s", msg) - - return - } - - // j.Threadid может быть пустым, значит либо нам его не дали, либо дали пустым. Это нормально. - - if exist := j.Message; exist == "" { - log.Warnf("Incorrect msg from redis, no message field: %s", msg) - - return - } - - if exist := j.Plugin; exist == "" { - log.Warnf("Incorrect msg from redis, no plugin field: %s", msg) - - return - } - - if exist := j.Mode; exist == "" { - log.Warnf("Incorrect msg from redis, no mode field: %s", msg) - - return - } - - // j.Misc.Answer может и не быть, тогда ответа на такое сообщение не будет. - // j.Misc.Botnick тоже можно не передавать, тогда будет записана пустая строка. - // j.Misc.Csign если нам его не передали, возьмём значение из конфига. - if exist := j.Misc.Csign; exist == "" { - j.Misc.Csign = config.Csign - } - - // j.Misc.Fwdcnt если нам его не передали, то будет 0. - if exist := j.Misc.Fwdcnt; exist == 0 { - j.Misc.Fwdcnt = 1 - } - - // j.Misc.GoodMorning может быть 1 или 0, по-умолчанию 0. - // j.Misc.Msgformat может быть 1 или 0, по-умолчанию 0. - // j.Misc.Username можно не передавать, тогда будет пустая строка. - - // Отвалидировались, теперь вернёмся к нашим баранам. - - // Если у нас циклическая пересылка сообщения, попробуем её тут разорвать, отбросив сообщение. - if j.Misc.Fwdcnt > config.ForwardsMax { - log.Warnf("Discarding msg with fwd_cnt exceeding max value: %s", msg) - - return - } - - j.Misc.Fwdcnt++ - - // Классифицирем входящие сообщения. Первым делом, попробуем определить команды. - if j.Message[0:len(j.Misc.Csign)] == j.Misc.Csign { - // Может быть, это команда модуля phrases? - var ( - done = false - cmd = j.Message[len(j.Misc.Csign):] - ) - - cmds := []string{"friday", "пятница", "proverb", "пословица", "пословиться", "fortune", "фортунка", "f", "ф", - "karma", "карма", "rum", "ром", "vodka", "водка", "beer", "пиво", "tequila", "текила", "whisky", "виски", - "absinthe", "абсент", "fuck"} - - for _, command := range cmds { - if cmd == command { - sendTo = config.ForwardChannels.Phrases - - // Костыль для кармы. - if cmd == "karma" || cmd == "карма" { - j.Misc.Answer = 1 - } - - done = true - - break - } - } - - // Не угадали? акей, как насчёт модуля webapp? - if !done { - cmds = []string{"frog", - "лягушка", "horse", "лошадь", "лошадка", "rabbit", "bunny", "кролик", "snail", "улитка", - "owl", "сова", "сыч"} - - for _, command := range cmds { - if cmd == command { - sendTo = config.ForwardChannels.Webapp - done = true - - break - } - } - } - - // Не угадали? акей, как насчёт модуля webapp-go? - if !done { - cmds = []string{"cat", "кис", "fox", "лис", "buni", "anek", "анек", "анекдот", "xkcd", "monkeyuser", "tits", - "boobs", "tities", "boobies", "сиси", "сисечки", "butt", "booty", "ass", "попа", "попка", "drink", - "праздник"} - - for _, command := range cmds { - if cmd == command { - sendTo = config.ForwardChannels.WebappGo - done = true - - break - } - } - } - - // Не фортануло? может, повезёт с модулем games? - if !done { - cmds = []string{"dig", "копать", "fish", "fishing", "рыба", "рыбка", "рыбалка"} - - for _, command := range cmds { - if cmd == command { - sendTo = config.ForwardChannels.Games - done = true - - break - } - } - } - - // Нет? Вдруг это комплексная команда модуля webapp? - if !done { - cmdLen := len(cmd) - - cmds := []string{"w ", "п ", "погода ", "погодка ", "погадка ", "weather "} - - for _, command := range cmds { - if cmdLen > len(command) && cmd[0:len(command)] == command { - sendTo = config.ForwardChannels.WebappGo - done = true - - break - } - } - } - - // Опять мимо? Давай тогда попытаем удачу в поиске комплексной команды для phrases. - if !done { - cmdLen := len(cmd) - - cmds := []string{"karma ", "карма ", "rum ", "ром ", "vodka ", "водка ", "beer ", "пиво ", "tequila ", - "текила ", "whisky ", "виски ", "absinthe ", "абсент "} - - for _, command := range cmds { - if cmdLen > len(command) && cmd[0:len(command)] == command { - sendTo = config.ForwardChannels.Phrases - - if command == "karma " || command == "карма " { - // Костыль для кармы - j.Misc.Answer = 1 - } - - break - } - } - } - } else { - // Попробуем выискать изменение кармы. - msgLen := len(j.Message) - - // ++ или -- на конце фразы - это наш кандидат. - if msgLen > len("++") { - if j.Message[msgLen-len("--"):msgLen] == "--" || j.Message[msgLen-len("++"):msgLen] == "++" { - // Предполагается, что менять карму мы будем для одной фразы, то есть для 1 строки - if len(strings.Split(j.Message, "\n")) == 1 { - sendTo = config.ForwardChannels.Phrases - - // Костыль для кармы - j.Misc.Answer = 1 - } - } - } - } - - // Настало время формировать json и засылать его в дальше. - var message sMsg - message.From = j.From - message.Userid = j.Userid - message.Chatid = j.Chatid - message.Threadid = j.Threadid - message.Message = j.Message - message.Plugin = j.Plugin - message.Mode = j.Mode - message.Misc.Fwdcnt = j.Misc.Fwdcnt - message.Misc.Csign = j.Misc.Csign - message.Misc.Username = j.Misc.Username - message.Misc.Answer = j.Misc.Answer - message.Misc.Botnick = j.Misc.Botnick - message.Misc.Msgformat = j.Misc.Msgformat - message.Misc.GoodMorning = j.Misc.GoodMorning - - data, err := json.Marshal(message) - - if err != nil { - log.Warnf("Unable to to serialize message for redis: %s", err) - - return - } - - // Заталкиваем наш json в редиску. - if err := redisClient.Publish(ctx, sendTo, data).Err(); err != nil { - log.Warnf("Unable to send data to redis channel %s: %s", sendTo, err) - } else { - log.Debugf("Send msg to redis channel %s: %s", sendTo, string(data)) - } -} - // readConfig читает и валидирует конфиг, а также выставляет некоторые default-ы, если значений для параметров в конфиге // нет. func readConfig() { diff --git a/msg-parsers.go b/msg-parsers.go new file mode 100644 index 0000000..f727fd2 --- /dev/null +++ b/msg-parsers.go @@ -0,0 +1,250 @@ +package main + +import ( + "context" + "encoding/json" + "strings" + + log "github.com/sirupsen/logrus" +) + +// msgParser горутинка, которая парсит json-чики прилетевшие из REDIS-ки. +func msgParser(ctx context.Context, msg string) { + var ( + sendTo = "craniac" + j rMsg + ) + + log.Debugf("Incomming raw json: %s", msg) + + if err := json.Unmarshal([]byte(msg), &j); err != nil { + log.Warnf("Unable to to parse message from redis channel: %s", err) + + return + } + + // Validate our j. + if exist := j.From; exist == "" { + log.Warnf("Incorrect msg from redis, no from field: %s", msg) + + return + } + + if exist := j.Chatid; exist == "" { + log.Warnf("Incorrect msg from redis, no chatid field: %s", msg) + + return + } + + if exist := j.Userid; exist == "" { + log.Warnf("Incorrect msg from redis, no userid field: %s", msg) + + return + } + + // j.Threadid может быть пустым, значит либо нам его не дали, либо дали пустым. Это нормально. + + if exist := j.Message; exist == "" { + log.Warnf("Incorrect msg from redis, no message field: %s", msg) + + return + } + + if exist := j.Plugin; exist == "" { + log.Warnf("Incorrect msg from redis, no plugin field: %s", msg) + + return + } + + if exist := j.Mode; exist == "" { + log.Warnf("Incorrect msg from redis, no mode field: %s", msg) + + return + } + + // j.Misc.Answer может и не быть, тогда ответа на такое сообщение не будет. + // j.Misc.Botnick тоже можно не передавать, тогда будет записана пустая строка. + // j.Misc.Csign если нам его не передали, возьмём значение из конфига. + if exist := j.Misc.Csign; exist == "" { + j.Misc.Csign = config.Csign + } + + // j.Misc.Fwdcnt если нам его не передали, то будет 0. + if exist := j.Misc.Fwdcnt; exist == 0 { + j.Misc.Fwdcnt = 1 + } + + // j.Misc.GoodMorning может быть 1 или 0, по-умолчанию 0. + // j.Misc.Msgformat может быть 1 или 0, по-умолчанию 0. + // j.Misc.Username можно не передавать, тогда будет пустая строка. + + // Отвалидировались, теперь вернёмся к нашим баранам. + + // Если у нас циклическая пересылка сообщения, попробуем её тут разорвать, отбросив сообщение. + if j.Misc.Fwdcnt > config.ForwardsMax { + log.Warnf("Discarding msg with fwd_cnt exceeding max value: %s", msg) + + return + } + + j.Misc.Fwdcnt++ + + // Классифицирем входящие сообщения. Первым делом, попробуем определить команды. + if j.Message[0:len(j.Misc.Csign)] == j.Misc.Csign { + // Может быть, это команда модуля phrases? + var ( + done = false + cmd = j.Message[len(j.Misc.Csign):] + ) + + cmds := []string{"friday", "пятница", "proverb", "пословица", "пословиться", "fortune", "фортунка", "f", "ф", + "karma", "карма", "rum", "ром", "vodka", "водка", "beer", "пиво", "tequila", "текила", "whisky", "виски", + "absinthe", "абсент", "fuck"} + + for _, command := range cmds { + if cmd == command { + sendTo = config.ForwardChannels.Phrases + + // Костыль для кармы. + if cmd == "karma" || cmd == "карма" { + j.Misc.Answer = 1 + } + + done = true + + break + } + } + + // Не угадали? акей, как насчёт модуля webapp? + if !done { + cmds = []string{"frog", + "лягушка", "horse", "лошадь", "лошадка", "rabbit", "bunny", "кролик", "snail", "улитка", + "owl", "сова", "сыч"} + + for _, command := range cmds { + if cmd == command { + sendTo = config.ForwardChannels.Webapp + done = true + + break + } + } + } + + // Не угадали? акей, как насчёт модуля webapp-go? + if !done { + cmds = []string{"cat", "кис", "fox", "лис", "buni", "anek", "анек", "анекдот", "xkcd", "monkeyuser", "tits", + "boobs", "tities", "boobies", "сиси", "сисечки", "butt", "booty", "ass", "попа", "попка", "drink", + "праздник"} + + for _, command := range cmds { + if cmd == command { + sendTo = config.ForwardChannels.WebappGo + done = true + + break + } + } + } + + // Не фортануло? может, повезёт с модулем games? + if !done { + cmds = []string{"dig", "копать", "fish", "fishing", "рыба", "рыбка", "рыбалка"} + + for _, command := range cmds { + if cmd == command { + sendTo = config.ForwardChannels.Games + done = true + + break + } + } + } + + // Нет? Вдруг это комплексная команда модуля webapp? + if !done { + cmdLen := len(cmd) + + cmds := []string{"w ", "п ", "погода ", "погодка ", "погадка ", "weather "} + + for _, command := range cmds { + if cmdLen > len(command) && cmd[0:len(command)] == command { + sendTo = config.ForwardChannels.WebappGo + done = true + + break + } + } + } + + // Опять мимо? Давай тогда попытаем удачу в поиске комплексной команды для phrases. + if !done { + cmdLen := len(cmd) + + cmds := []string{"karma ", "карма ", "rum ", "ром ", "vodka ", "водка ", "beer ", "пиво ", "tequila ", + "текила ", "whisky ", "виски ", "absinthe ", "абсент "} + + for _, command := range cmds { + if cmdLen > len(command) && cmd[0:len(command)] == command { + sendTo = config.ForwardChannels.Phrases + + if command == "karma " || command == "карма " { + // Костыль для кармы + j.Misc.Answer = 1 + } + + break + } + } + } + } else { + // Попробуем выискать изменение кармы. + msgLen := len(j.Message) + + // ++ или -- на конце фразы - это наш кандидат. + if msgLen > len("++") { + if j.Message[msgLen-len("--"):msgLen] == "--" || j.Message[msgLen-len("++"):msgLen] == "++" { + // Предполагается, что менять карму мы будем для одной фразы, то есть для 1 строки + if len(strings.Split(j.Message, "\n")) == 1 { + sendTo = config.ForwardChannels.Phrases + + // Костыль для кармы + j.Misc.Answer = 1 + } + } + } + } + + // Настало время формировать json и засылать его в дальше. + var message sMsg + message.From = j.From + message.Userid = j.Userid + message.Chatid = j.Chatid + message.Threadid = j.Threadid + message.Message = j.Message + message.Plugin = j.Plugin + message.Mode = j.Mode + message.Misc.Fwdcnt = j.Misc.Fwdcnt + message.Misc.Csign = j.Misc.Csign + message.Misc.Username = j.Misc.Username + message.Misc.Answer = j.Misc.Answer + message.Misc.Botnick = j.Misc.Botnick + message.Misc.Msgformat = j.Misc.Msgformat + message.Misc.GoodMorning = j.Misc.GoodMorning + + data, err := json.Marshal(message) + + if err != nil { + log.Warnf("Unable to to serialize message for redis: %s", err) + + return + } + + // Заталкиваем наш json в редиску. + if err := redisClient.Publish(ctx, sendTo, data).Err(); err != nil { + log.Warnf("Unable to send data to redis channel %s: %s", sendTo, err) + } else { + log.Debugf("Send msg to redis channel %s: %s", sendTo, string(data)) + } +}