Implement user blacklist
This commit is contained in:
parent
e81249c79f
commit
d5ffbaada4
88
scripts/blacklist.coffee
Normal file
88
scripts/blacklist.coffee
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# Description:
|
||||||
|
# user blacklist
|
||||||
|
#
|
||||||
|
# Requires:
|
||||||
|
# "fast-levenshtein": "1.0.6"
|
||||||
|
#
|
||||||
|
# Commands:
|
||||||
|
# asjon ignora <utente> - ignora i messaggi inviati da un utente
|
||||||
|
# asjon ascolta <utente> - riabilita un utente ignorato
|
||||||
|
#
|
||||||
|
# Author:
|
||||||
|
# Michele Guerini Rocco (rnhmjoj)
|
||||||
|
|
||||||
|
lev = require 'fast-levenshtein'
|
||||||
|
|
||||||
|
module.exports = (robot) ->
|
||||||
|
success = ['ok, farò finta di non sentire', 'si, non gli rispondo più',
|
||||||
|
'va bene, da ora in poi lo ignoro', 'ok, lo ignoro']
|
||||||
|
prevent = ['sei proprio sicuro?', 'non credo sia una buona idea',
|
||||||
|
'ne sei certo?', 'direi che è meglio di no']
|
||||||
|
notFound = ['non so chi sia', 'sicuro? non lo trovo', 'boh, chi è?',
|
||||||
|
'mai sentito, hai scritto giusto?', 'boh, non lo trovo']
|
||||||
|
noPermit = ['BZBZ 403-NOT-AUTHORIZED', 'BZBZ DOES-NOT-COMPUTE',
|
||||||
|
'BZBZ ADMIN-NOT-DETECTED', 'BZBZ IS-NOT-AUTHORIZED',
|
||||||
|
'BZBZ ACCESS-DENIED']
|
||||||
|
|
||||||
|
isFromAdmin = (res) ->
|
||||||
|
res.robot.adapterName is 'shell' or
|
||||||
|
res.message.room is process.env.ADMIN_ROOM
|
||||||
|
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
|
robot.respond /ignora (.+)/i, (res) ->
|
||||||
|
if not isFromAdmin res
|
||||||
|
return res.send res.random noPermit
|
||||||
|
|
||||||
|
name = res.match[1]
|
||||||
|
users = (v for k, v of robot.brain.users())
|
||||||
|
match = find_closest name, (i.name for i in users)
|
||||||
|
|
||||||
|
if match?
|
||||||
|
user = robot.brain.userForName match
|
||||||
|
list = robot.brain.get 'blacklist'
|
||||||
|
|
||||||
|
if user.name is res.message.user.name
|
||||||
|
return res.send res.random prevent
|
||||||
|
|
||||||
|
robot.brain.set 'blacklist', (list or []).concat [user.id]
|
||||||
|
robot.logger.info "user #{user.name} is now blacklisted"
|
||||||
|
res.send res.random success
|
||||||
|
else
|
||||||
|
robot.logger.info "no known user matches #{name}"
|
||||||
|
res.send res.random notFound
|
||||||
|
|
||||||
|
|
||||||
|
robot.respond /ascolta (.+)/i, (res) ->
|
||||||
|
if not isFromAdmin res
|
||||||
|
return res.send res.random noPermit
|
||||||
|
|
||||||
|
name = res.match[1]
|
||||||
|
users = (v for k, v of robot.brain.users())
|
||||||
|
match = find_closest name, (i.name for i in users)
|
||||||
|
|
||||||
|
if match?
|
||||||
|
user = robot.brain.userForName match
|
||||||
|
list = (robot.brain.get 'blacklist') or []
|
||||||
|
|
||||||
|
index = list.indexOf user.id
|
||||||
|
if index > 0
|
||||||
|
robot.brain.set 'blacklist', list
|
||||||
|
robot.logger.info "user #{user.name} restored"
|
||||||
|
res.send res.random success
|
||||||
|
else
|
||||||
|
robot.logger.info "user #{user.name} was not blacklisted"
|
||||||
|
res.send 'non era ignorato'
|
||||||
|
else
|
||||||
|
robot.logger.info "no known user matches #{name}"
|
||||||
|
res.send res.random notFound
|
@ -13,8 +13,6 @@
|
|||||||
{ CatchAllMessage } = require 'hubot'
|
{ CatchAllMessage } = require 'hubot'
|
||||||
|
|
||||||
module.exports = (robot) ->
|
module.exports = (robot) ->
|
||||||
|
|
||||||
#direct talk in user chat
|
|
||||||
receive = (message) ->
|
receive = (message) ->
|
||||||
listeners = ->
|
listeners = ->
|
||||||
res = []
|
res = []
|
||||||
@ -27,12 +25,20 @@ module.exports = (robot) ->
|
|||||||
false
|
false
|
||||||
res
|
res
|
||||||
|
|
||||||
|
# ignore blacklisted users
|
||||||
|
if message.user.id in (robot.brain.get('blacklist') or [])
|
||||||
|
robot.logger.info 'ignored message from user ' + message.user.name
|
||||||
|
return
|
||||||
|
|
||||||
results = listeners()
|
results = listeners()
|
||||||
unless message.done or (results.reduce (x, y) -> x or y)
|
|
||||||
|
# allow direct talk in user chat or campfire
|
||||||
|
unless message.done or (true in results)
|
||||||
if message.room == message.user.id or message.user.id is 1
|
if message.room == message.user.id or message.user.id is 1
|
||||||
message.text = robot.name + ' ' + message.text
|
message.text = robot.name + ' ' + message.text
|
||||||
results.push listeners()...
|
results.push listeners()...
|
||||||
if message not instanceof CatchAllMessage and (results.indexOf true) is -1
|
|
||||||
|
if message not instanceof CatchAllMessage and (true not in results)
|
||||||
robot.receive new CatchAllMessage message
|
robot.receive new CatchAllMessage message
|
||||||
|
|
||||||
robot.receive = receive
|
robot.receive = receive
|
||||||
|
Loading…
Reference in New Issue
Block a user