From 3a862deb6bb31e6e093fc2eba9e37d6e819e0dd8 Mon Sep 17 00:00:00 2001 From: tkdrg Date: Tue, 28 Oct 2014 18:05:08 -0300 Subject: [PATCH] Adds chatroom logging (both admin and IC). --- code/__HELPERS/_logging.dm | 6 +- code/game/machinery/computer/message.dm | 35 ++++++ code/game/objects/items/devices/PDA/PDA.dm | 81 ++++++------- .../objects/items/devices/PDA/chatroom.dm | 112 ++++++++++++++---- code/modules/research/message_server.dm | 21 ++++ 5 files changed, 189 insertions(+), 66 deletions(-) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 03265398796..8a81f7992ca 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -70,4 +70,8 @@ /proc/log_pda(text) if (config.log_pda) - diary << "\[[time_stamp()]]PDA: [text]" \ No newline at end of file + diary << "\[[time_stamp()]]PDA: [text]" + +/proc/log_chat(text) + if (config.log_pda) //reusing this for now, can change if needed + diary << "\[[time_stamp()]]CHAT: [text]" \ No newline at end of file diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 04226b689d2..0790775530f 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -114,8 +114,10 @@ else dat += "
[++i]. View Message Logs
" dat += "
[++i]. View Request Console Logs
" + dat += "
[++i]. View Chatroom Logs
" dat += "
[++i]. Clear Message Logs
" dat += "
[++i]. Clear Request Console Logs
" + dat += "
[++i]. Clear Chatroom Logs
" dat += "
[++i]. Set Custom Key
" dat += "
[++i]. Send Admin Message
" else @@ -236,6 +238,24 @@ [rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]"} dat += "" + //Chatroom Logs + if(5) + + var/index = 0 + //var/sender = "Anon" + //var/channel = "ss13" + //var/message = "Blank" + dat += "
Back - Refresh

" + dat += "" + for(var/datum/data_chat_msg/msg in src.linkedServer.chat_msgs) + index++ + if(index > 3000) + break + // Del - Channel - Sender - Message + // X - #ss13 - bigdik - hi asl + dat += "" + dat += "
XChannelNickMessage
X
[msg.channel][msg.sender][msg.message]
" + message = defaultmsg //user << browse(dat, "window=message;size=700x700") //onclose(user, "message") @@ -321,6 +341,14 @@ if(auth) src.linkedServer.rc_msgs = list() message = "NOTICE: Logs cleared." + //Clears the chatroom logs - KEY REQUIRED + if (href_list["clearc"]) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.linkedServer.chat_msgs = list() + message = "NOTICE: Logs cleared." //Change the password - KEY REQUIRED if (href_list["pass"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) @@ -464,6 +492,13 @@ else if(auth) src.screen = 4 + //Chatroom Logs - KEY REQUIRED + if(href_list["viewc"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + if(auth) + src.screen = 5 //usr << href_list["select"] diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index a1b781c0e64..0e652086ee9 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -44,7 +44,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/obj/item/device/paicard/pai = null // A slot for a personal AI device - var/datum/chatroom/chat_channel = "" //name of our current NTRC channel, without the # + var/chat_channel = "#ss13" //name of our current NTRC channel var/datum/event/ntrc_event //our ntrc event trigger var/nick = "" //our NTRC nick var/list/ntrclog = list() //NTRC message log @@ -430,21 +430,16 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "
" if (5) - if(!nick) + if(!nick) //first time join nick = copytext(sanitize(owner), 1, 9) - dat += "

Space Station 13 Nanotrasen Relay Chat Network

" + var/datum/chatroom/C = chatchannels[chat_channel] + C.parse_msg(src, nick, "/join [chat_channel]") + dat += "

SS13 Nanotrasen Relay Chat Network

" - if(!chat_channel) - dat += "
[strip_html_properly(nick)]" - dat += "

Detected Channels

" - for(var/C in chatchannels) - dat += "
  • #[html_encode(C)]
  • " - - else - - dat += "[strip_html_properly(nick)] | " - dat += "#[strip_html_properly(chat_channel)] | " - dat += "Write message
    " + dat += "[nick] | " + dat += "[chat_channel] | " + dat += "Write message
    " + if(chat_channel) dat += ntrclog[chat_channel] else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub. @@ -513,6 +508,8 @@ var/global/list/obj/item/device/pda/PDAs = list() mode = 3 if("4")//Redirects to hub mode = 0 + if("5")//Chatroom + mode = 5 //MAIN FUNCTIONS=================================== @@ -619,28 +616,22 @@ var/global/list/obj/item/device/pda/PDAs = list() //CHATROOM FUNCTIONS==================================== if("Set Nick") - var/t = input(U, "Please enter nickname", name, null) as text + var/t = stripped_input(U, "Please enter nickname", name, null) as text nick = copytext(sanitize(t), 1, 9) if("Set Channel") - var/t = href_list["C"] - if(!t) - if(chat_channel) - var/datum/chatroom/C = chatchannels[chat_channel] - C.events.clearEvent("msg_chat", ntrc_event) - chat_channel = "" - else - chat_channel = t + var/t = stripped_input(U, "Please enter channel", name, (chat_channel)) as text + + if(t && t in chatchannels) + ntrclog[chat_channel] = "
    " + ntrclog[chat_channel] var/datum/chatroom/C = chatchannels[chat_channel] - var/ret = C.parse_msg(src,nick,"/join") - if(findtextEx(ret,"ERR_",1,5)) - ntrclog[chat_channel] = "[ret]
    " + ntrclog[chat_channel] - else - ntrc_event = ret + chat_channel = t + var/ret = C.parse_msg(src, nick, "/join [chat_channel]") + if(ret == "ERR_AUTH") + ntrclog[chat_channel] = "Please use /auth password to authenticate and then join again." + ntrclog[chat_channel] if("NTRC Message") - var/t = input(U, "Please enter message", name, null) as text - t = strip_html_properly(t) + var/t = msg_input(U) as text var/datum/chatroom/C = chatchannels[chat_channel] if(C) var/ret = C.parse_msg(src,nick,t) @@ -710,8 +701,9 @@ var/global/list/obj/item/device/pda/PDAs = list() else//Cartridge menu linking mode = text2num(href_list["choice"]) - cartridge.mode = mode - cartridge.unlock() + if(cartridge) + cartridge.mode = mode + cartridge.unlock() else//If not in range, can't interact or not using the pda. U.unset_machine() U << browse(null, "window=pda") @@ -743,40 +735,39 @@ var/global/list/obj/item/device/pda/PDAs = list() id.loc = get_turf(src) id = null -/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P) - +/obj/item/device/pda/proc/msg_input(var/mob/living/U = usr) var/t = input(U, "Please enter message", name, null) as text t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN) - if (!t || !istype(P)) + if (!t || toff) return if (!in_range(src, U) && loc != U) return - - if (isnull(P)||P.toff || toff) + if(!can_use(U)) return + if(emped) + t = Gibberish(t, 100) + return t + +/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P) + + var/t = msg_input(U) if (last_text && world.time < last_text + 5) return - if(!can_use(U)) + if (isnull(P) || P.toff || !istype(P)) return last_text = world.time - // check if telecomms I/O route 1459 is stable - //var/telecomms_intact = telecomms_process(P.owner, owner, t) var/obj/machinery/message_server/useMS = null if(message_servers) for (var/obj/machinery/message_server/MS in message_servers) //PDAs are now dependant on the Message Server. if(MS.active) useMS = MS - break var/datum/signal/signal = src.telecomms_process() - if(emped) - t = Gibberish(t, 100) - var/useTC = 0 if(signal) if(signal.data["done"]) @@ -1126,6 +1117,8 @@ var/global/list/obj/item/device/pda/PDAs = list() ntrclog[C] = msg + ntrclog[C] else ntrclog[channel] = msg + ntrclog[channel] + if (!silent) + loc.audible_message("\icon[src] *[ttone]*", null, 3) /proc/get_viewable_pdas() . = list() diff --git a/code/game/objects/items/devices/PDA/chatroom.dm b/code/game/objects/items/devices/PDA/chatroom.dm index 054eb45d928..5451314d326 100644 --- a/code/game/objects/items/devices/PDA/chatroom.dm +++ b/code/game/objects/items/devices/PDA/chatroom.dm @@ -5,29 +5,35 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) //channel.parse_msg /datum/chatroom - var/name = "ss13" + var/name = "#ss13" var/channelpassword = "" - var/operator = "" var/topic = "Welcome to #ss13! The best NTRC channel in this sector of the galaxy!" // topic message for the chatroom + var/list/operators = list() // chat operators var/list/logs = list() // chat logs var/list/muted = list() // muted users - var/list/auth = list() - var/list/pass = list() + var/list/banned = list() // banned users + var/list/auth = list() // authenticated clients + var/list/pass = list() // user passwords + var/list/users = list() // current users var/datum/events/events = new () + var/list/datum/event/evlist = list() /datum/chatroom/New() channelpassword = rand() -//parse_msg() is the exposed interface +//parse_msg() is the exposed interface chat //clients should interact with parse_msg() and parse_msg() only /datum/chatroom/proc/parse_msg(client,nick,message) - if(!check_server(client)) + var/obj/machinery/message_server/MS = check_server(client) + if(!MS) return "ERR_TCOM" if(!nick || length(nick) > 8) return "ERR_NICK" + MS.send_chat_message(nick,name,message) + if(findtext(message,"/",1,2)) return handle_command(client,nick,copytext(message,2)) @@ -43,7 +49,7 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) for (var/obj/machinery/message_server/MS in message_servers) var/turf/T = get_turf(MS) if(MS.active && (T.z == CT.z)) - return 1 + return MS return 0 /datum/chatroom/proc/handle_command(client,nick,command) //command parser @@ -56,22 +62,36 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) return "ERR_AUTH" switch(cmd[1]) //argument-less commmands - if("join") - return channel_join(client,nick) if("topic") if(cmd.len == 1) return get_topic(client) else return set_topic(client,nick,cmd[2]) + if("part") + return channel_part(client,nick) if("del") return delete_channel(client,nick) + if("who") + return get_who(client, nick) if(cmd.len == 1) return "ERR_ARGS" switch(cmd[1]) //commands with 1 arg - if("op") + if("join") + return channel_join(client,nick,cmd[2]) + if("opself") return operator_auth(client,nick,cmd[2]) + if("op") + return make_op(client,nick,cmd[2]) + if("deop") + return deop(client,nick,cmd[2]) + if("ban") + return ban(client,nick,cmd[2]) + if("unban") + return unban(client,nick,cmd[2]) + if("kick") + return kick(client,nick,cmd[2]) if("register") return register_auth(client,nick,cmd[2]) if("mute") @@ -88,7 +108,8 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) return "ERR_MUTE" if(!message) return "ERR_BLNK" - logs += "[strip_html_properly(nick)]> [strip_html_properly(message)]<" + logs += "[strip_html_properly(nick)]> [strip_html_properly(message)]" + log_chat("[usr]/([usr.ckey]) as [nick] sent to [name]: [message]") events.fireEvent("msg_chat",name,nick,message) return 1 @@ -111,25 +132,69 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) return 1 /datum/chatroom/proc/delete_channel(client,nick) //delete - if(nick == operator) + if(nick in operators) for(var/event in events.events) events.clearEvent("msg_chat",event) qdel(src) return 1 return 0 -/datum/chatroom/proc/channel_join(client,nick) //join - get_topic(client,nick) - return events.addEvent("msg_chat",client,"msg_chat") +/datum/chatroom/proc/channel_join(client,nick,channel) //join + if(channel == name) + if(nick in banned || nick in users) + return 0 + users += nick + get_topic(client,nick) + evlist[nick] = events.addEvent("msg_chat",client,"msg_chat") + return 1 + else + channel_part(client,nick) + var/datum/chatroom/C = chatchannels[channel] + return C.parse_msg(client,nick,"/join [channel]") -/datum/chatroom/proc/operator_auth(client,nick,pass) //op +/datum/chatroom/proc/channel_part(client,nick) //part + users -= nick + events.clearEvent("msg_chat",evlist[nick]) + return 1 + +/datum/chatroom/proc/operator_auth(client,nick,pass) //opself if(pass == channelpassword) - operator += nick + operators += nick + return 1 + return 0 + +/datum/chatroom/proc/make_op(client,nick,target) //op + if(nick in operators) + operators += target + return 1 + return 0 + +/datum/chatroom/proc/deop(client,nick,target) //deop + if(nick in operators) + operators -= target + return 1 + return 0 + +/datum/chatroom/proc/ban(client,nick,target) //ban + if(nick in operators) + banned += target + return 1 + return 0 + +/datum/chatroom/proc/unban(client,nick,target) //unban + if(nick in operators) + banned -= target + return 1 + return 0 + +/datum/chatroom/proc/kick(client,nick,target) //kick + if(nick in operators) + channel_part(null,nick) return 1 return 0 /datum/chatroom/proc/set_topic(client,nick,newtopic) //topic - if(operator == nick) + if(nick in operators) topic = strip_html_properly(newtopic) return 1 return 0 @@ -138,13 +203,18 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom) call(client,"msg_chat")(name,"NTbot",topic) return 1 +/datum/chatroom/proc/get_who(client,nick) //who + for(var/user in users) + call(client,"msg_chat")(name,"NTbot",user) + return 1 + /datum/chatroom/proc/get_log(client,nick,lines) //log for(var/i=0;i chat_msg_amt) + chat_msg_amt = MS.chat_msgs.len if(MS.pda_msgs.len > pda_msg_amt) pda_msg_amt = MS.pda_msgs.len if(MS.rc_msgs.len > rc_msg_amt) @@ -260,6 +280,7 @@ var/obj/machinery/blackbox_recorder/blackbox feedback_add_details("radio_usage","SRV-[msg_service.len]") feedback_add_details("radio_usage","CAR-[msg_cargo.len]") feedback_add_details("radio_usage","OTH-[messages.len]") + feedback_add_details("radio_usage","CHA-[chat_msg_amt]") feedback_add_details("radio_usage","PDA-[pda_msg_amt]") feedback_add_details("radio_usage","RC-[rc_msg_amt]")