Add new command and refactor code
This commit is contained in:
parent
f3d2514d2f
commit
62631dcd6e
@ -8,6 +8,7 @@
|
|||||||
# hubot chi sei - chiedi a hubot di identificarsi
|
# hubot chi sei - chiedi a hubot di identificarsi
|
||||||
# hubot chi sono / cosa sai di me - mostra il tuo contatto nel registro di hubot
|
# 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 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 (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 (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)
|
# 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'
|
lev = require 'fast-levenshtein'
|
||||||
|
|
||||||
module.exports = (robot) ->
|
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
|
# format a name as telegram-cli likes it
|
||||||
norm = (x) -> x.replace /\ /g, '_'
|
norm = (x) -> x.replace /\ /g, '_'
|
||||||
@ -44,8 +65,10 @@ module.exports = (robot) ->
|
|||||||
client.setEncoding 'utf8'
|
client.setEncoding 'utf8'
|
||||||
client.on 'data', (reply) ->
|
client.on 'data', (reply) ->
|
||||||
if callback?
|
if callback?
|
||||||
callback (reply.split '\n')[1..-3]
|
res = (reply.split '\n')[1..-3]
|
||||||
client.end()
|
[..., err] = res[0].split ' '
|
||||||
|
callback res, err
|
||||||
|
client.end()
|
||||||
|
|
||||||
# return an object with the known chat information
|
# return an object with the known chat information
|
||||||
chat_info = (name, callback) ->
|
chat_info = (name, callback) ->
|
||||||
@ -103,6 +126,10 @@ module.exports = (robot) ->
|
|||||||
robot.logger.info 'parsed bot chats list: ' + JSON.stringify chats, null, 2
|
robot.logger.info 'parsed bot chats list: ' + JSON.stringify chats, null, 2
|
||||||
callback chats
|
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 a user to the contact list
|
||||||
add_contact = (name, phone, callback) ->
|
add_contact = (name, phone, callback) ->
|
||||||
robot.logger.info "create contact for user #{name}"
|
robot.logger.info "create contact for user #{name}"
|
||||||
@ -128,6 +155,40 @@ module.exports = (robot) ->
|
|||||||
run_command "history #{norm chat} #{size}", (lines) ->
|
run_command "history #{norm chat} #{size}", (lines) ->
|
||||||
callback ((match_all regex, lines.join '\n').map parse_line)
|
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.respond /chi sei/, (res) ->
|
||||||
robot_info (user) ->
|
robot_info (user) ->
|
||||||
@ -155,90 +216,52 @@ module.exports = (robot) ->
|
|||||||
else
|
else
|
||||||
res.send "fatto!"
|
res.send "fatto!"
|
||||||
|
|
||||||
robot.respond /banna(l(o|a)| (.+))/, (res) ->
|
robot.respond /(invita|aggiungi) (.+)/, (res) ->
|
||||||
ok = [', ora non sarai più un problema', ' terminato',
|
name = res.match[2]
|
||||||
' non farti più vedere', ', questa è la tua fine'
|
id = res.message.room
|
||||||
' sparito definitivamente']
|
if id.match /^user/
|
||||||
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/
|
|
||||||
return res.send 'non è un gruppo questo'
|
return res.send 'non è un gruppo questo'
|
||||||
|
contact_list (contacts) ->
|
||||||
chat_info res.message.room, (chat) ->
|
name = find_closest(name, contacts)
|
||||||
get_history chat.name, 2, (history) ->
|
if not name?
|
||||||
robot_info (self) ->
|
return res.send res.random unknown
|
||||||
name = resolve_name(res.match[3], chat, history)
|
res.send res.random success
|
||||||
|
user_info name, (user) ->
|
||||||
if not name?
|
chat_info id, (chat) ->
|
||||||
return res.send res.random unk
|
add_user user, chat, res
|
||||||
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
|
|
||||||
|
|
||||||
robot.respond /(mi )?invit(i|ami) (in|nel gruppo) ([^?]+)\??/, (res) ->
|
robot.respond /(mi )?invit(i|ami) (in|nel gruppo) ([^?]+)\??/, (res) ->
|
||||||
denied = ['BZBZ ADMIN-NOT-DETECTED', 'BZBZ IS-NOT-AUTHORIZED',
|
denied = ['BZBZ ADMIN-NOT-DETECTED', 'BZBZ IS-NOT-AUTHORIZED',
|
||||||
'BZBZ ACCESS-DENIED']
|
'BZBZ ACCESS-DENIED']
|
||||||
nope = ['ahahah NO', 'mai sentito questo', 'invita anche me magari',
|
failed = ['ahahah NO', 'mai sentito questo',
|
||||||
'che?']
|
'invita anche me magari', 'che?']
|
||||||
ok = ['provvedo subito', 'ok', 'certo', 'va bene']
|
|
||||||
done = ['fatto', 'ecco qui', 'ecco fatto']
|
|
||||||
|
|
||||||
user = res.message.user
|
user = res.message.user
|
||||||
name = res.match[4]
|
name = res.match[4]
|
||||||
admin_id = process.env['ADMIN_ROOM'].replace ':', '#'
|
admin_id = process.env['ADMIN_ROOM'].replace ':', '#'
|
||||||
|
|
||||||
chat_list (list) ->
|
chat_list (list) ->
|
||||||
if not (name in list)
|
if not (name in list)
|
||||||
return res.send res.random nope
|
return res.send res.random failed
|
||||||
chat_info name, (chat) ->
|
chat_info name, (chat) ->
|
||||||
if chat.id is admin_id
|
if chat.id is admin_id
|
||||||
return res.send res.random denied
|
return res.send res.random denied
|
||||||
if user.name in chat.members
|
if user.name in chat.members
|
||||||
return res.send 'ma sei già nel gruppo... [facepalm]'
|
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.respond /banna(l(o|a)| (.+))/, (res) ->
|
||||||
robot.logger.info "add user #{user.name} to chat #{chat.name}"
|
if res.message.room.match /^user/
|
||||||
robot.logger.info 'result: ' + reply[0]
|
return res.send 'non è un gruppo questo'
|
||||||
err = (reply[0].split ' ')[-1..][0]
|
chat_info res.message.room, (chat) ->
|
||||||
if err is 'SUCCESS'
|
get_history chat.name, 2, (history) ->
|
||||||
robot.messageRoom chat.id, res.random done
|
robot_info (self) ->
|
||||||
robot.messageRoom chat.id, 'benvento'
|
target = res.match[3]
|
||||||
else if err is 'USER_NOT_MUTUAL_CONTACT'
|
if not target?
|
||||||
res.send 'aah, non posso: ho bisogno del tuo contatto'
|
name = history[0].peer
|
||||||
else
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user