Add new command and refactor code

This commit is contained in:
rnhmjoj 2016-03-29 03:42:55 +02:00
parent f3d2514d2f
commit 62631dcd6e

View File

@ -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 <nome> - chiedi ad hubot di invitare qualcuno nel gruppo attuale
# hubot (mi inviti / invitami) (nel gruppo / in) <gruppo> - 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 <nome> - 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