Merge pull request #5086 from UristMcKerman/spam-filter

Spam filter
This commit is contained in:
Chinsky
2014-06-01 20:09:06 +04:00
5 changed files with 96 additions and 20 deletions

View File

@@ -26,7 +26,7 @@
var/emag = 0 // When it is emagged. var/emag = 0 // When it is emagged.
var/message = "<span class='notice'>System bootup complete. Please select an option.</span>" // The message that shows on the main menu. var/message = "<span class='notice'>System bootup complete. Please select an option.</span>" // The message that shows on the main menu.
var/auth = 0 // Are they authenticated? var/auth = 0 // Are they authenticated?
var/optioncount = 7 var/optioncount = 8
// Custom Message Properties // Custom Message Properties
var/customsender = "System Administrator" var/customsender = "System Administrator"
var/obj/item/device/pda/customrecepient = null var/obj/item/device/pda/customrecepient = null
@@ -122,6 +122,7 @@
dat += "<dd><A href='?src=\ref[src];clearr=1'>&#09;[++i]. Clear Request Console Logs</a><br></dd>" dat += "<dd><A href='?src=\ref[src];clearr=1'>&#09;[++i]. Clear Request Console Logs</a><br></dd>"
dat += "<dd><A href='?src=\ref[src];pass=1'>&#09;[++i]. Set Custom Key</a><br></dd>" dat += "<dd><A href='?src=\ref[src];pass=1'>&#09;[++i]. Set Custom Key</a><br></dd>"
dat += "<dd><A href='?src=\ref[src];msg=1'>&#09;[++i]. Send Admin Message</a><br></dd>" dat += "<dd><A href='?src=\ref[src];msg=1'>&#09;[++i]. Send Admin Message</a><br></dd>"
dat += "<dd><A href='?src=\ref[src];spam=1'>&#09;[++i]. Modify Spam Filter</a><br></dd>"
else else
for(var/n = ++i; n <= optioncount; n++) for(var/n = ++i; n <= optioncount; n++)
dat += "<dd><font color='blue'>&#09;[n]. ---------------</font><br></dd>" dat += "<dd><font color='blue'>&#09;[n]. ---------------</font><br></dd>"
@@ -240,6 +241,19 @@
<td width='15%'>[rc.rec_dpt]</td><td width='300px'>[rc.message]</td><td width='15%'>[rc.stamp]</td><td width='15%'>[rc.id_auth]</td><td width='15%'>[rc.priority]</td></tr>"} <td width='15%'>[rc.rec_dpt]</td><td width='300px'>[rc.message]</td><td width='15%'>[rc.stamp]</td><td width='15%'>[rc.id_auth]</td><td width='15%'>[rc.priority]</td></tr>"}
dat += "</table>" dat += "</table>"
//Spam filter modification
if(5)
dat += "<center><A href='?src=\ref[src];back=1'>Back</a> - <A href='?src=\ref[src];refresh=1'>Refresh</center><hr>"
var/index = 0
for(var/token in src.linkedServer.spamfilter)
index++
if(index > 3000)
break
dat += "<dd>[index]&#09; <a href='?src=\ref[src];deltoken=[index]'>\[[token]\]</a><br></dd>"
dat += "<hr>"
if (linkedServer.spamfilter.len < linkedServer.spamfilter_limit)
dat += "<a href='?src=\ref[src];addtoken=1'>Add token</a><br>"
dat += "</body>" dat += "</body>"
message = defaultmsg message = defaultmsg
@@ -485,6 +499,26 @@
//usr << href_list["select"] //usr << href_list["select"]
if(href_list["spam"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 5
if(href_list["addtoken"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
src.linkedServer.spamfilter += input(usr,"Enter text you want to be filtered out","Token creation") as text|null
if(href_list["deltoken"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
var/tokennum = text2num(href_list["deltoken"])
src.linkedServer.spamfilter.Cut(tokennum,tokennum+1)
if (href_list["back"]) if (href_list["back"])
src.screen = 0 src.screen = 0

View File

@@ -917,7 +917,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(useTC != 2) // Does our recipient have a broadcaster on their level? if(useTC != 2) // Does our recipient have a broadcaster on their level?
U << "ERROR: Cannot reach recipient." U << "ERROR: Cannot reach recipient."
return return
useMS.send_pda_message("[P.owner]","[owner]","[t]") var/send_result = useMS.send_pda_message("[P.owner]","[owner]","[t]")
if (send_result)
U << "ERROR: Messaging server rejected your message. Reason: contains '[send_result]'."
return
tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]"))) tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]")))
P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]"))) P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]")))
for(var/mob/M in player_list) for(var/mob/M in player_list)

View File

@@ -48,6 +48,15 @@
target << law target << law
target.add_ion_law(law) target.add_ion_law(law)
if(message_servers)
for (var/obj/machinery/message_server/MS in message_servers)
MS.spamfilter.Cut()
var/i
for (i = 1, i <= MS.spamfilter_limit, i++)
MS.spamfilter += pick("kitty","HONK","rev","malf","liberty","freedom","drugs", "Exodus", \
"admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\
"diector", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno")
/datum/event/ionstorm/tick() /datum/event/ionstorm/tick()
if(botEmagChance) if(botEmagChance)
for(var/obj/machinery/bot/bot in world) for(var/obj/machinery/bot/bot in world)

View File

@@ -1,27 +1,31 @@
/datum/event/pda_spam /datum/event/pda_spam
endWhen = 6000 endWhen = 36000
var/time_failed = 0 var/last_spam_time = 0
var/obj/machinery/message_server/useMS var/obj/machinery/message_server/useMS
/datum/event/pda_spam/setup() /datum/event/pda_spam/setup()
time_failed = world.time last_spam_time = world.time
for (var/obj/machinery/message_server/MS in message_servers) pick_message_server()
if(MS.active)
useMS = MS
break
/datum/event/pda_spam/tick() /datum/event/pda_spam/proc/pick_message_server()
if(!useMS || !useMS.active)
useMS = null
if(message_servers) if(message_servers)
for (var/obj/machinery/message_server/MS in message_servers) for (var/obj/machinery/message_server/MS in message_servers)
if(MS.active) if(MS.active)
useMS = MS useMS = MS
break break
/datum/event/pda_spam/tick()
if(world.time > last_spam_time + 3000)
//if there's no spam managed to get to receiver for five minutes, give up
kill()
return
if(!useMS || !useMS.active)
useMS = null
pick_message_server()
if(useMS) if(useMS)
time_failed = world.time if(prob(5))
if(prob(2))
// /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "") // /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
var/obj/item/device/pda/P var/obj/item/device/pda/P
var/list/viables = list() var/list/viables = list()
@@ -86,7 +90,10 @@
"You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\ "You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\
"You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!") "You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!")
useMS.send_pda_message("[P.owner]", sender, message) if (useMS.send_pda_message("[P.owner]", sender, message)) //Message been filtered by spam filter.
return
last_spam_time = world.time
if (prob(50)) //Give the AI an increased chance to intercept the message if (prob(50)) //Give the AI an increased chance to intercept the message
for(var/mob/living/silicon/ai/ai in mob_list) for(var/mob/living/silicon/ai/ai in mob_list)
@@ -111,6 +118,3 @@
if(L) if(L)
L << "\icon[P] <b>Message from [sender] (Unknown / spam?), </b>\"[message]\" (Unable to Reply)" L << "\icon[P] <b>Message from [sender] (Unknown / spam?), </b>\"[message]\" (Unable to Reply)"
else if(world.time > time_failed + 1200)
//if there's no server active for two minutes, give up
kill()

View File

@@ -1,3 +1,6 @@
#define MESSAGE_SERVER_SPAM_REJECT 1
#define MESSAGE_SERVER_DEFAULT_SPAM_LIMIT 10
var/global/list/obj/machinery/message_server/message_servers = list() var/global/list/obj/machinery/message_server/message_servers = list()
/datum/data_pda_msg /datum/data_pda_msg
@@ -59,6 +62,12 @@ var/global/list/obj/machinery/message_server/message_servers = list()
var/active = 1 var/active = 1
var/decryptkey = "password" var/decryptkey = "password"
//Spam filtering stuff
var/list/spamfilter = list("You have won", "your prize", "male enhancement", "shitcurity", \
"are happy to inform you", "account number", "enter your PIN")
//Messages having theese tokens will be rejected by server. Case sensitive
var/spamfilter_limit = MESSAGE_SERVER_DEFAULT_SPAM_LIMIT //Maximal amount of tokens
/obj/machinery/message_server/New() /obj/machinery/message_server/New()
message_servers += src message_servers += src
decryptkey = GenerateKey() decryptkey = GenerateKey()
@@ -89,7 +98,13 @@ var/global/list/obj/machinery/message_server/message_servers = list()
return return
/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "") /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
var/result
for (var/token in spamfilter)
if (findtextEx(message,token))
message = "<font color=\"red\">[message]</font>" //Rejected messages will be indicated by red color.
result = token //Token caused rejection (if there are multiple, last will be chosen>.
pda_msgs += new/datum/data_pda_msg(recipient,sender,message) pda_msgs += new/datum/data_pda_msg(recipient,sender,message)
return result
/obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1) /obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1)
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth) rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
@@ -102,6 +117,16 @@ var/global/list/obj/machinery/message_server/message_servers = list()
return return
/obj/machinery/message_server/attackby(obj/item/weapon/O as obj, mob/living/user as mob)
if (active && !(stat & (BROKEN|NOPOWER)) && (spamfilter_limit < MESSAGE_SERVER_DEFAULT_SPAM_LIMIT*2) && \
istype(O,/obj/item/weapon/circuitboard/message_monitor))
spamfilter_limit += round(MESSAGE_SERVER_DEFAULT_SPAM_LIMIT / 2)
user.drop_item()
del(O)
user << "You install additional memory and processors into message server. Its filtering capabilities been enhanced."
else
..(O, user)
/obj/machinery/message_server/update_icon() /obj/machinery/message_server/update_icon()
if((stat & (BROKEN|NOPOWER))) if((stat & (BROKEN|NOPOWER)))
icon_state = "server-nopower" icon_state = "server-nopower"