GLOBAL_VAR_INIT(ntnrc_uid, 0) /datum/ntnet_conversation var/id var/title = "Untitled Conversation" var/datum/ntnet_user/operator // "Administrator" of this channel. Creator starts as channel's operator, var/list/messages = list() var/list/users = list() var/direct = FALSE var/password /datum/ntnet_conversation/New(var/name, var/no_operator) id = GLOB.ntnrc_uid GLOB.ntnrc_uid++ if(name) title = name if(GLOB.ntnet_global) GLOB.ntnet_global.chat_channels.Add(src) if(no_operator) operator = "NanoTrasen Information Technology Division" // assign a fake operator ..() /datum/ntnet_conversation/proc/process_message(var/datum/ntnet_message/message, var/update_ui = TRUE) var/admin_log = message.format_admin_log() if (admin_log) log_ntirc("[message.user.client.ckey] ([message.user.client.mob.real_name])|([message.nuser.username]) -> ([title]): [GLOB.admin_log]", ckey=key_name(message.user), conversation=title) for(var/datum/ntnet_user/U in users) for(var/datum/computer_file/program/chat_client/Cl in U.clients) var/notification_text = message.format_chat_notification(src, Cl) if(notification_text && Cl.can_receive_notification(message.client)) if(!Cl.message_mute) Cl.computer.output_message(notification_text, 0) if(message.play_sound) Cl.play_notification_sound(message.client) var/ntnet_log = message.format_ntnet_log(src) if(ntnet_log) GLOB.ntnet_global.add_log(ntnet_log, message.client.computer.network_card, TRUE) var/chat_log = message.format_chat_log(src) if(chat_log) messages.Add(chat_log) trim_message_list() if(update_ui) for(var/datum/ntnet_user/U in users) for(var/datum/computer_file/program/chat_client/Cl in U.clients) SStgui.update_uis(Cl) /datum/ntnet_conversation/proc/trim_message_list() if(messages.len <= 50) return for(var/message in messages) messages -= message if(messages.len <= 50) return /// EXTERNAL PROCs /datum/ntnet_conversation/proc/get_title(var/datum/computer_file/program/chat_client/cl = null) if(direct) var/names = list() for(var/datum/ntnet_user/U in users) names += U.username if(istype(cl) && istype(cl.my_user)) names -= cl.my_user.username return "\[DM] [english_list(names)]" else return title /datum/ntnet_conversation/proc/can_see(var/datum/computer_file/program/chat_client/cl) if(cl.netadmin_mode) return TRUE if(istype(cl.my_user)) if(cl.my_user in users) return TRUE else for(var/datum/ntnet_user/user in users) if(cl in user.clients) return TRUE if(!direct) return TRUE return FALSE /datum/ntnet_conversation/proc/can_interact(var/datum/computer_file/program/chat_client/cl) if(cl.netadmin_mode) return TRUE if(istype(cl.my_user)) if(cl.my_user in users) return TRUE else for(var/datum/ntnet_user/user in users) if(cl in user.clients) return TRUE return FALSE /datum/ntnet_conversation/proc/can_manage(var/datum/computer_file/program/chat_client/cl) if(cl.netadmin_mode) return TRUE if(cl.my_user == operator) return TRUE return FALSE /datum/ntnet_conversation/proc/cl_send(var/datum/computer_file/program/chat_client/Cl, var/message, var/mob/user) if(!istype(Cl) || !can_interact(Cl)) return var/datum/ntnet_message/message/msg = new(Cl) msg.message = message msg.user = user //[signal.data["name"]] ([signal.data["job"]])", signal.data["message"], signal.data["photo"] var/list/signal_data = list() signal_data["name"] = user.GetVoice() signal_data["job"] = user.job signal_data["message"] = message signal_data["photo"] = null // If the channel has a title, use the title, otherwise add the users if(title != initial(title)) signal_data["targets"] = list("[title] (Channel)") else signal_data["targets"] = list() for(var/datum/ntnet_user/U in users) if(U != Cl.my_user) signal_data["targets"] += U.username var/datum/signal/subspace/pda/signal = new(Cl.computer, signal_data) signal.send_to_receivers() process_message(msg) /datum/ntnet_conversation/proc/cl_join(var/datum/computer_file/program/chat_client/Cl) if(!istype(Cl) || !can_see(Cl) || direct) return if(Cl.my_user in users) return var/datum/ntnet_message/join/msg = new(Cl) Cl.my_user.channels.Add(src) users.Add(Cl.my_user) if(!operator) operator = Cl.my_user var/datum/ntnet_message/new_op/msg2 = new(Cl) process_message(msg, FALSE) process_message(msg2) return process_message(msg) /datum/ntnet_conversation/proc/cl_leave(var/datum/computer_file/program/chat_client/Cl) if(!istype(Cl) || !istype(Cl.my_user) || !(Cl.my_user in users) || !can_interact(Cl) || direct) return if(Cl.focused_conv == src) Cl.focused_conv = null var/datum/ntnet_message/leave/msg = new(Cl) Cl.my_user.channels.Remove(src) users.Remove(Cl.my_user) if(operator == Cl.my_user) if(users.len) operator = pick(users) var/datum/ntnet_message/new_op/msg2 = new() msg2.nuser = operator process_message(msg, FALSE) process_message(msg2) return process_message(msg) /datum/ntnet_conversation/proc/cl_change_title(var/datum/computer_file/program/chat_client/Cl, var/newTitle) if(!istype(Cl) || !istype(Cl.my_user) || !can_manage(Cl) || direct) return var/datum/ntnet_message/new_title/msg = new(Cl) msg.title = newTitle process_message(msg) title = newTitle /datum/ntnet_conversation/proc/cl_set_password(var/datum/computer_file/program/chat_client/Cl, var/newPassword) if(!istype(Cl) || !istype(Cl.my_user) || !can_manage(Cl) || direct) return if(newPassword) password = newPassword else password = null var/datum/ntnet_message/new_password/msg = new() msg.nuser = operator process_message(msg) /datum/ntnet_conversation/proc/cl_kick(var/datum/computer_file/program/chat_client/Cl, var/datum/ntnet_user/target) if(!istype(Cl) || !istype(Cl.my_user) || !can_manage(Cl) || !(target in users) || direct) return var/datum/ntnet_message/kick/msg = new(Cl) msg.target = target target.channels.Remove(src) users.Remove(target) if(operator == target) if(users.len) operator = pick(users) var/datum/ntnet_message/new_op/msg2 = new() msg2.nuser = operator process_message(msg, FALSE) process_message(msg2) return process_message(msg)