diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index ac5181f751f..2d369961551 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -635,40 +635,26 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/t = stripped_input(U, "Please enter channel", name, (chat_channel)) as text
if(t)
- ntrclog[chat_channel] = "
" + ntrclog[chat_channel]
var/datum/chatroom/C = chatchannels[chat_channel]
- if(!findtext(t,"#",1,2))
- t = "#" + t
- chat_channel = t
- C.parse_msg(src, nick, "/join [chat_channel]")
+ var/ret = C.parse_msg(src, nick, "/join [t]")
+ if((ret in chatchannels) && (ret != chat_channel))
+ ntrclog[chat_channel] = "
" + ntrclog[chat_channel]
+ chat_channel = ret
if("NTRC Message")
var/t = msg_input(U) as text
var/datum/chatroom/C = chatchannels[chat_channel]
if(C)
- var/lt = text2list(t, " ")
- if(lt[1] == "/join")
- if(!findtext(lt[2],"#",1,2))
- lt[2] = "#" + lt[2]
var/ret = C.parse_msg(src,nick,t)
- if(findtextEx(ret,"ERR_",1,5))
+ if(findtextEx(ret,"BAD_",1,5))
ntrclog[chat_channel] = "[ret]
" + ntrclog[chat_channel]
- else
- if(ret == 0)
- ntrclog[chat_channel] = "Failure
" + ntrclog[chat_channel]
- else
- if(lt[1] == "/join")
- chat_channel = lt[2]
+ else if(ret in chatchannels)
+ chat_channel = ret
if("NTRC Help")
- var/helptext = "NTRC reference:
"
- helptext += "General commands
"
- helptext += "/join #channel
/part
/log amountoflines
/who
/topic
/register
"
- helptext += "Moderation commands
"
- helptext += "/ban targetnick
/unban targetnick
/kick targetnick
/mute targetnick
"
- helptext += "Management commands
"
- helptext += "/topic topictext
/op targetnick
/deop targetnick
/delchannel"
- usr << browse(helptext, "window=ntrchelp;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
+ var/helptext = "NTRC Commands:
"
+ helptext += "/join #channel
/register
/log amountoflines
"
+ usr << browse(helptext, "window=ntrchelp;size=200x200;border=1;can_resize=1;can_close=1;can_minimize=1")
@@ -1161,7 +1147,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
ntrclog[C] = msg + ntrclog[C]
else
ntrclog[channel] = msg + ntrclog[channel]
- if (!silent)
+ if (findtext(message, nick) && !silent)
loc.audible_message("\icon[src] *[ttone]*", null, 3)
/proc/get_viewable_pdas()
diff --git a/code/game/objects/items/devices/PDA/chatroom.dm b/code/game/objects/items/devices/PDA/chatroom.dm
index 1ba6a4c5813..cc82b4c4c96 100644
--- a/code/game/objects/items/devices/PDA/chatroom.dm
+++ b/code/game/objects/items/devices/PDA/chatroom.dm
@@ -1,4 +1,4 @@
-var/datum/chatroom/default_ntrc_chatroom = new("")
+var/datum/chatroom/default_ntrc_chatroom = new()
var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom)
//procs that can be used directly:
@@ -6,13 +6,9 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom)
/datum/chatroom
var/name = "#ss13"
- var/topic = "Welcome to 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/banned = list() // banned users
var/list/auth = list() // authenticated clients
- var/list/users = list() // current users
+ var/list/authed = list() //authenticated users
var/datum/events/events = new ()
var/list/datum/event/evlist = list()
@@ -22,20 +18,25 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom)
/datum/chatroom/proc/parse_msg(client,nick,message)
var/obj/machinery/message_server/MS = check_server(client)
if(!MS)
- return "ERR_TCOM"
+ return "BAD_TCOM"
- if(!nick || length(nick) > 8)
- return "ERR_NICK"
+ if(!get_auth(client,nick) || !nick || length(nick) > 8)
+ return "BAD_NICK"
MS.send_chat_message(nick,name,message)
- if(findtext(message,"/",1,2))
- return handle_command(client,nick,copytext(message,2))
+ var/list/cmd=text2list(message, " ")
+ switch(cmd[1])
+ if("/register")
+ return register_auth(client,nick)
+ if("/join")
+ if(cmd[2]) return channel_join(client,nick,cmd[2])
+ if("/log")
+ if(cmd[2]) return get_log(client,nick,cmd[2])
- else
- return send_message(client,nick,message)
+ return send_message(client,nick,message)
-//the following are for internal use only
+//the following are helper procs, FOR INTERNAL USE ONLY
/datum/chatroom/proc/check_server(client)
var/atom/C = client
@@ -45,168 +46,51 @@ var/list/chatchannels = list(default_ntrc_chatroom.name = default_ntrc_chatroom)
var/turf/T = get_turf(MS)
if(MS.active && (T.z == CT.z))
return MS
- return 0
-
-/datum/chatroom/proc/handle_command(client,nick,command) //command parser
- var/list/cmd=text2list(command, " ")
-
- if(!get_auth(client,nick))
- return "ERR_AUTH"
-
- switch(cmd[1]) //argument-less commmands
- 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("delchannel")
- return delete_channel(client,nick)
- if("who")
- return get_who(client, nick)
- if("register")
- return register_auth(client,nick)
-
- if(cmd.len == 1)
- return "ERR_ARGS"
-
- switch(cmd[1]) //commands with 1 arg
- if("join")
- return channel_join(client,nick,cmd[2])
- if("log")
- return get_log(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("mute")
- return mute_nick(client,nick,cmd[2])
-
- return "ERR_WCMD"
+ return null
/datum/chatroom/proc/send_message(client,nick,message) //standard message
- if(nick in muted)
- return "ERR_MUTE"
if(!message)
- return "ERR_BLNK"
- logs += "[strip_html_properly(nick)]> [strip_html_properly(message)]"
+ return 0
+ logs.Insert(1,"[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
/datum/chatroom/proc/get_auth(client,nick) //check auth
- if((!(nick in auth)) || (auth[nick] == client))
+ if((!(nick in authed)) || (auth[client] == nick))
return 1
return 0
-//chat commands go here
+//chat commands go here, FOR INTERNAL USE ONLY
/datum/chatroom/proc/register_auth(client,nick) //register
if(!get_auth(client,nick))
- return 0
- auth[nick] = client
+ return "BAD_REGS"
+ auth[client] = nick
+ authed += nick
return 1
-/datum/chatroom/proc/delete_channel(client,nick) //delchannel
- 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,channel) //join
if(!findtext(channel,"#",1,2))
channel = "#" + channel
- 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
+ if(channel == name) //join this channel
+ if(!(client in evlist))
+ evlist[client] = events.addEvent("msg_chat",client,"msg_chat")
+ return name
+
+ else //leave this channel, join another one
+ if(client in evlist)
+ events.clearEvent("msg_chat",evlist[client])
+ evlist -= client
if(!(channel in chatchannels))
- var/ret = new_channel(client,nick,channel)
- if(!ret)
- return 0
- channel_part(client,nick)
+ var/datum/chatroom/NC = new /datum/chatroom()
+ NC.name = channel
+ chatchannels[channel] = NC
var/datum/chatroom/C = chatchannels[channel]
return C.parse_msg(client,nick,"/join [channel]")
-/datum/chatroom/proc/channel_part(client,nick) //part
- users -= nick
- events.clearEvent("msg_chat",evlist[nick])
- return 1
-
-/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(nick in operators)
- topic = strip_html_properly(newtopic)
- return 1
- return 0
-
-/datum/chatroom/proc/get_topic(client,nick) //topic
- call(client,"msg_chat")(name,"NTbot","TOPIC: [topic]")
- return 1
-
-/datum/chatroom/proc/get_who(client,nick) //who
- for(var/user in users)
- call(client,"msg_chat")(name,"NTbot","WHO: [user]")
- return 1
-
/datum/chatroom/proc/get_log(client,nick,lines) //log
+ lines = text2num(lines)
+ lines = min(lines, logs.len)
for(var/i=0;i