Files
Aurora.3/code/modules/modular_computers/NTNet/NTNRC/conversation.dm
Matt Atlas 1645af37cc Chatclient fixes 2 (#16587)
* Fixes the chat client and services.

* oh how we love you

* lemme talk to 'em...

* a

* m

* lilas

* bro

---------

Co-authored-by: Matt Atlas <liermattia@gmail.com>
2023-06-29 12:31:42 +00:00

178 lines
5.3 KiB
Plaintext

var/global/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 = ntnrc_uid
ntnrc_uid++
if(name)
title = name
if(ntnet_global)
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]): [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)
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
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 = FALSE
/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)