From 62631dcd6e3f692438b71163a831b172ad0ca6db Mon Sep 17 00:00:00 2001 From: rnhmjoj Date: Tue, 29 Mar 2016 03:42:55 +0200 Subject: [PATCH] Add new command and refactor code --- scripts/telegram.coffee | 167 +++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 72 deletions(-) diff --git a/scripts/telegram.coffee b/scripts/telegram.coffee index fb3cf88..7b187bc 100644 --- a/scripts/telegram.coffee +++ b/scripts/telegram.coffee @@ -8,6 +8,7 @@ # hubot chi sei - chiedi a hubot di identificarsi # hubot chi sono / cosa sai di me - mostra il tuo contatto nel registro di hubot # hubot in che gruppi sei / dove scrivi - chiedi a hubot dove chatta +# hubot invita/aggiungi - chiedi ad hubot di invitare qualcuno nel gruppo attuale # hubot (mi inviti / invitami) (nel gruppo / in) - chiedi ad hubot di invitardi in un gruppo # hubot (aggiungi[mi] / crea) (il mio / [tra]i contatto/i) [telefono] - chiedi ad hubot di creare il tuo contatto # hubot banna - chiedi di bannare un utente dal gruppo attuale (solo se hubot l'ha invitato) @@ -21,6 +22,26 @@ net = require 'net' lev = require 'fast-levenshtein' module.exports = (robot) -> + # messages + error = 'oh no: c\'è stato un errore, non so' + done = ['fatto', 'ecco qui', 'ecco fatto'] + success = ['provvedo subito', 'ok', 'certo', 'va bene'] + unknown = ['non so chi sia', 'chi?', 'mai sentito', 'sicuro? non lo trovo'] + failed = ['eh, mi piacerebbe molto ma non posso', 'i have no powers here', + 'nope, non l\'ho invitato io', 'non sono admin qui, sorry'] + banned = [', ora non sarai più un problema', ' terminato', + ' non farti più vedere', ', questa è la tua fine' + ' sparito per sempre'] + + # find closest match with levenshtein metric + find_closest = (target, list) -> + dists = [].concat.apply [], ( + for str in list + for word in [str].concat str.split ' ' + [(lev.get target, word), str] ) + [dist, name] = dists.reduce (x, y) -> + if x[0] < y[0] then x else y + return if dist < 4 then name else null # format a name as telegram-cli likes it norm = (x) -> x.replace /\ /g, '_' @@ -44,8 +65,10 @@ module.exports = (robot) -> client.setEncoding 'utf8' client.on 'data', (reply) -> if callback? - callback (reply.split '\n')[1..-3] - client.end() + res = (reply.split '\n')[1..-3] + [..., err] = res[0].split ' ' + callback res, err + client.end() # return an object with the known chat information chat_info = (name, callback) -> @@ -103,6 +126,10 @@ module.exports = (robot) -> robot.logger.info 'parsed bot chats list: ' + JSON.stringify chats, null, 2 callback chats + # return the list of contacts (names only) + contact_list = (callback) -> + run_command 'contact_list', callback + # add a user to the contact list add_contact = (name, phone, callback) -> robot.logger.info "create contact for user #{name}" @@ -128,6 +155,40 @@ module.exports = (robot) -> run_command "history #{norm chat} #{size}", (lines) -> callback ((match_all regex, lines.join '\n').map parse_line) + # ban user from a group chat + delete_user = (user, chat, res) -> + run_command "chat_del_user #{chat.id} #{user.id}", (reply, err) -> + robot.logger.info "delete user #{user.name} from chat #{chat.name}" + robot.logger.info 'result: ' + reply[0] + if err is 'SUCCESS' + robot.logger.info 'user deleted' + res.send user.name + res.random banned + else if err is 'CHAT_ADMIN_REQUIRED' + robot.logger.warning 'cannot delete user: not authorized' + res.send res.random failed + else + robot.logger.error 'error:\n' + reply.join '\n' + res.send error + + # add user to a group chat + add_user = (user, chat, res) -> + run_command "chat_add_user #{chat.id} #{user.id}", (reply, err) -> + robot.logger.info "add user #{user.name} to chat #{chat.name}" + robot.logger.info 'result: ' + reply[0] + if err is 'SUCCESS' + robot.messageRoom chat.id, res.random done + else if err is 'USER_NOT_MUTUAL_CONTACT' + robot.logger.warning 'cannot add user: not authorized' + res.send 'ah, non posso: ho bisogno del contatto' + else if err is 'USER_ALREADY_PARTICIPANT' + robot.logger.warning 'cannot add user: user already present' + res.send 'ma è già qui!' + else if err is 'CHAT_ADMIN_REQUIRED' + robot.logger.warning 'cannot add user: not authorized' + res.send res.random failed + else + robot.logger.error 'error:\n' + reply.join '\n' + res.send error robot.respond /chi sei/, (res) -> robot_info (user) -> @@ -155,90 +216,52 @@ module.exports = (robot) -> else res.send "fatto!" - robot.respond /banna(l(o|a)| (.+))/, (res) -> - ok = [', ora non sarai più un problema', ' terminato', - ' non farti più vedere', ', questa è la tua fine' - ' sparito definitivamente'] - unk = ['non so chi sia', 'chi?', 'mai sentito', 'sicuro? non lo trovo'] - nope = ['eh, mi piacerebbe molto ma non posso', 'i have no powers here', - 'nope, non l\'ho invitato io', 'non sono admin qui, sorry'] - - resolve_name = (name, chat, history) -> - if name? - # find the closest match - dists = [].concat.apply [], ( - for user in chat.members - for word in [user].concat user.split ' ' - [(lev.get name, word), user] ) - [dist, name] = dists.reduce (x, y) -> - if x[0] < y[0] then x else y - - return if dist < 4 then name else null - else - # use the latest message peer - return history[0].peer - - delete_user = (user, chat) -> - run_command "chat_del_user #{chat.id} #{user.id}", (reply) -> - err = (reply[0].split ' ')[-1..][0] - robot.logger.info "delete user #{user.name} from chat #{chat.name}" - - if err is 'SUCCESS' - robot.logger.info 'user deleted' - res.send user.name + res.random ok - else if err is 'CHAT_ADMIN_REQUIRED' - res.send res.random nope - robot.logger.warning 'cannot delete user: not authorized' - else - robot.logger.error 'error:\n' + reply.join '\n' - res.send 'oh no: c\'è stato un errore, non so' - - if res.message.room.match /^user/ + robot.respond /(invita|aggiungi) (.+)/, (res) -> + name = res.match[2] + id = res.message.room + if id.match /^user/ return res.send 'non è un gruppo questo' - - chat_info res.message.room, (chat) -> - get_history chat.name, 2, (history) -> - robot_info (self) -> - name = resolve_name(res.match[3], chat, history) - - if not name? - return res.send res.random unk - if name in [res.message.user.name, self.name] - return res.send 'ma sei scemo o cosa?' - - user_info name, (user) -> - delete_user user, chat + contact_list (contacts) -> + name = find_closest(name, contacts) + if not name? + return res.send res.random unknown + res.send res.random success + user_info name, (user) -> + chat_info id, (chat) -> + add_user user, chat, res robot.respond /(mi )?invit(i|ami) (in|nel gruppo) ([^?]+)\??/, (res) -> denied = ['BZBZ ADMIN-NOT-DETECTED', 'BZBZ IS-NOT-AUTHORIZED', 'BZBZ ACCESS-DENIED'] - nope = ['ahahah NO', 'mai sentito questo', 'invita anche me magari', - 'che?'] - ok = ['provvedo subito', 'ok', 'certo', 'va bene'] - done = ['fatto', 'ecco qui', 'ecco fatto'] - + failed = ['ahahah NO', 'mai sentito questo', + 'invita anche me magari', 'che?'] user = res.message.user name = res.match[4] admin_id = process.env['ADMIN_ROOM'].replace ':', '#' - chat_list (list) -> if not (name in list) - return res.send res.random nope + return res.send res.random failed chat_info name, (chat) -> if chat.id is admin_id return res.send res.random denied if user.name in chat.members return res.send 'ma sei già nel gruppo... [facepalm]' - res.send res.random ok + res.send res.random success + add_user user, chat, res - run_command "chat_add_user #{chat.id} #{user.id}", (reply) -> - robot.logger.info "add user #{user.name} to chat #{chat.name}" - robot.logger.info 'result: ' + reply[0] - err = (reply[0].split ' ')[-1..][0] - if err is 'SUCCESS' - robot.messageRoom chat.id, res.random done - robot.messageRoom chat.id, 'benvento' - else if err is 'USER_NOT_MUTUAL_CONTACT' - res.send 'aah, non posso: ho bisogno del tuo contatto' + robot.respond /banna(l(o|a)| (.+))/, (res) -> + if res.message.room.match /^user/ + return res.send 'non è un gruppo questo' + chat_info res.message.room, (chat) -> + get_history chat.name, 2, (history) -> + robot_info (self) -> + target = res.match[3] + if not target? + name = history[0].peer else - res.send "non sono riuscito, c'è un errore: #{reply[0]}" + name = find_closest(target, chat.members) + if not name? + return res.send res.random unknown + if name in [res.message.user.name, self.name] + return res.send 'ma sei scemo o cosa?' + user_info name, (user) -> delete_user user, chat, res