mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-22 12:29:46 +01:00
New chat client / messenger (#10654)
This commit is contained in:
@@ -1,381 +1,253 @@
|
||||
/datum/computer_file/program/chatclient
|
||||
/datum/computer_file/program/chat_client
|
||||
filename = "ntnrc_client"
|
||||
filedesc = "Chat Client"
|
||||
program_icon_state = "command"
|
||||
extended_desc = "This program allows communication over the NTNRC network."
|
||||
extended_desc = "This program allows communication over the NTRC network."
|
||||
size = 2
|
||||
requires_ntnet = TRUE
|
||||
requires_ntnet_feature = NTNET_COMMUNICATION
|
||||
network_destination = "NTNRC server"
|
||||
ui_header = "ntnrc_idle.gif"
|
||||
program_type = PROGRAM_TYPE_ALL
|
||||
network_destination = "NTRC server"
|
||||
available_on_ntnet = TRUE
|
||||
nanomodule_path = /datum/nano_module/program/computer_chatclient
|
||||
color = LIGHT_COLOR_GREEN
|
||||
silent = FALSE
|
||||
|
||||
var/last_message // Used to generate the toolbar icon
|
||||
var/username
|
||||
var/datum/ntnet_conversation/channel
|
||||
var/operator_mode = FALSE // Channel operator mode
|
||||
var/datum/ntnet_user/my_user
|
||||
var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords)
|
||||
var/set_offline = FALSE // appear "invisible"
|
||||
var/list/directmessagechannels = list()
|
||||
var/set_offline = FALSE // appear "invisible"
|
||||
|
||||
var/ringtone = "beep"
|
||||
var/syndi_auth = FALSE
|
||||
|
||||
/datum/computer_file/program/chatclient/New(var/obj/item/modular_computer/comp)
|
||||
..(comp)
|
||||
if(!comp)
|
||||
return
|
||||
|
||||
/datum/computer_file/program/chatclient/Destroy()
|
||||
ntnet_global.chat_clients -= src
|
||||
/datum/computer_file/program/chat_client/Destroy()
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/chatclient/Topic(href, href_list)
|
||||
/datum/computer_file/program/chat_client/proc/can_receive_notification(var/datum/computer_file/program/chat_client/from)
|
||||
return ((program_state > PROGRAM_STATE_KILLED || service_state > PROGRAM_STATE_KILLED) && from != src && get_signal(NTNET_COMMUNICATION))
|
||||
|
||||
/datum/computer_file/program/chat_client/proc/play_notification_sound(var/datum/computer_file/program/chat_client/from)
|
||||
if(!silent && src != from && program_state == PROGRAM_STATE_BACKGROUND)
|
||||
playsound(computer, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
computer.output_message("[icon2html(computer, world)] *[ringtone]*", 2)
|
||||
|
||||
/datum/computer_file/program/chat_client/Topic(href, href_list)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
if(href_list["PRG_toggleringer"])
|
||||
. = TRUE
|
||||
silent = !silent
|
||||
|
||||
if(href_list["PRG_setringtone"])
|
||||
. = TRUE
|
||||
var/t = input(usr, "Please enter new ringtone", filedesc, ringtone) as text|null
|
||||
if(!usr.Adjacent(computer) || !t)
|
||||
return
|
||||
|
||||
if(href_list["ringtone"])
|
||||
var/newRingtone = href_list["ringtone"]
|
||||
var/obj/item/device/uplink/hidden/H = computer.hidden_uplink
|
||||
if(istype(H) && H.check_trigger(usr, lowertext(t), lowertext(H.pda_code)))
|
||||
if(istype(H) && H.check_trigger(usr, lowertext(newRingtone), lowertext(H.pda_code)))
|
||||
to_chat(usr, SPAN_NOTICE("\The [computer] softly beeps."))
|
||||
syndi_auth = TRUE
|
||||
SSnanoui.close_uis(NM)
|
||||
SSvueui.close_uis(src)
|
||||
else
|
||||
t = sanitize(t, 20)
|
||||
ringtone = t
|
||||
|
||||
if(href_list["PRG_speak"])
|
||||
. = TRUE
|
||||
add_message(send_message())
|
||||
|
||||
if(href_list["Reply"])
|
||||
. = TRUE
|
||||
var/datum/ntnet_conversation/C = locate(href_list["Reply"]) in ntnet_global.chat_channels
|
||||
if(!istype(C))
|
||||
to_chat(usr, SPAN_WARNING("The target channel couldn't be found and has likely been deleted!"))
|
||||
return
|
||||
var/message = send_message()
|
||||
if(!(C in ntnet_global.chat_channels))
|
||||
to_chat(usr, SPAN_WARNING("The target channel couldn't be found and has likely been deleted!"))
|
||||
return
|
||||
add_message(message, C)
|
||||
|
||||
if(href_list["PRG_joinchannel"])
|
||||
. = TRUE
|
||||
var/datum/ntnet_conversation/C
|
||||
for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels)
|
||||
if(chan.id == text2num(href_list["PRG_joinchannel"]))
|
||||
C = chan
|
||||
break
|
||||
|
||||
if(!C)
|
||||
return TRUE
|
||||
|
||||
if(netadmin_mode)
|
||||
channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others.
|
||||
return TRUE
|
||||
|
||||
if(C.password)
|
||||
var/mob/living/user = usr
|
||||
var/password = sanitize(input(user, "Access Denied. Enter password:"))
|
||||
if(C?.password == password)
|
||||
C.add_client(src)
|
||||
channel = C
|
||||
return TRUE
|
||||
C.add_client(src)
|
||||
message_dead(FONT_SMALL("<b>([C.get_dead_title()]) A new client ([username]) has entered the chat.</b>"))
|
||||
channel = C
|
||||
if(href_list["PRG_leavechannel"])
|
||||
. = TRUE
|
||||
if(channel && !channel.direct)
|
||||
channel.remove_client(src)
|
||||
message_dead(FONT_SMALL(FONT_SMALL("<b>([channel.get_dead_title()]) A client ([username]) has left the chat.</b>")))
|
||||
channel = null
|
||||
if(href_list["PRG_backtomain"])
|
||||
. = TRUE
|
||||
channel = null
|
||||
if(href_list["PRG_newchannel"])
|
||||
. = TRUE
|
||||
newRingtone = sanitize(newRingtone, 20)
|
||||
ringtone = newRingtone
|
||||
SSvueui.check_uis_for_change(src)
|
||||
|
||||
// User only commands
|
||||
if(!istype(my_user))
|
||||
return
|
||||
// Following actions require signal
|
||||
if(!get_signal(NTNET_COMMUNICATION))
|
||||
return
|
||||
|
||||
if(href_list["send"])
|
||||
var/mob/living/user = usr
|
||||
var/channel_title = sanitize(input(user, "Enter channel name or leave blank to cancel:"))
|
||||
if(!channel_title)
|
||||
return
|
||||
var/datum/ntnet_conversation/C = new /datum/ntnet_conversation(channel_title)
|
||||
C.add_client(src)
|
||||
C.operator = src
|
||||
channel = C
|
||||
message_dead(FONT_SMALL("<b>([channel.get_dead_title()]) A new channel has been made by [username].</b>"))
|
||||
if(href_list["PRG_toggleadmin"])
|
||||
. = TRUE
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["send"]["target"])
|
||||
var/message = href_list["send"]["message"]
|
||||
if(istype(conv) && message)
|
||||
if(ishuman(user))
|
||||
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] [computer.lexical_name]'s screen.")
|
||||
conv.cl_send(src, message, user)
|
||||
if(href_list["join"])
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["join"]["target"])
|
||||
var/password = href_list["join"]["password"]
|
||||
if(istype(conv))
|
||||
if(conv.password)
|
||||
if(conv.password == password)
|
||||
conv.cl_join(src)
|
||||
else
|
||||
// How do I alert of password invalid?
|
||||
else
|
||||
conv.cl_join(src)
|
||||
if(href_list["leave"])
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["leave"])
|
||||
if(istype(conv))
|
||||
conv.cl_leave(src)
|
||||
SSvueui.check_uis_for_change(src)
|
||||
if(href_list["kick"])
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["kick"]["target"])
|
||||
var/datum/ntnet_user/tUser = locate(href_list["kick"]["user"])
|
||||
if(istype(conv) && istype(tUser))
|
||||
conv.cl_kick(src, tUser)
|
||||
if(href_list["set_password"])
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["set_password"]["target"])
|
||||
var/password = href_list["set_password"]["password"]
|
||||
if(istype(conv))
|
||||
conv.cl_set_password(src, password)
|
||||
if(href_list["change_title"])
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["change_title"]["target"])
|
||||
var/newTitle = href_list["change_title"]["title"]
|
||||
if(istype(conv))
|
||||
conv.cl_change_title(src, newTitle)
|
||||
if(href_list["new_channel"])
|
||||
ntnet_global.begin_conversation(src, sanitize(href_list["new_channel"]))
|
||||
if(href_list["delete"])
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["delete"])
|
||||
if(istype(conv) && conv.can_manage(src))
|
||||
ntnet_global.chat_channels.Remove(conv)
|
||||
qdel(conv)
|
||||
SSvueui.check_uis_for_change(src)
|
||||
if(href_list["direct"])
|
||||
var/datum/ntnet_user/tUser = locate(href_list["direct"])
|
||||
ntnet_global.begin_direct(src, tUser)
|
||||
|
||||
if(href_list["toggleadmin"])
|
||||
if(netadmin_mode)
|
||||
netadmin_mode = FALSE
|
||||
if(channel)
|
||||
channel.remove_client(src) // We shouldn't be in channel's user list, but just in case...
|
||||
channel = null
|
||||
return TRUE
|
||||
var/mob/living/user = usr
|
||||
if(can_run(usr, 1, access_network))
|
||||
if(channel)
|
||||
var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No")
|
||||
if(response == "Yes")
|
||||
if(channel)
|
||||
channel.remove_client(src)
|
||||
channel = null
|
||||
else
|
||||
return
|
||||
netadmin_mode = TRUE
|
||||
if(href_list["PRG_changename"])
|
||||
. = TRUE
|
||||
var/mob/living/user = usr
|
||||
var/new_name = sanitize(input(user, "Enter new nickname or leave blank to cancel:"))
|
||||
if(!new_name)
|
||||
return TRUE
|
||||
var/comp_name = ckey(new_name)
|
||||
for(var/cl in ntnet_global.chat_clients)
|
||||
var/datum/computer_file/program/chatclient/C = cl
|
||||
if(ckey(C.username) == comp_name || comp_name == "cancel")
|
||||
alert(user, "This nickname is already taken.")
|
||||
return TRUE
|
||||
for(var/datum/ntnet_conversation/channel in ntnet_global.chat_channels)
|
||||
if(src in channel.clients)
|
||||
channel.add_status_message("[username] is now known as [new_name].")
|
||||
username = new_name
|
||||
if(href_list["PRG_savelog"])
|
||||
. = TRUE
|
||||
if(!channel)
|
||||
return
|
||||
var/mob/living/user = usr
|
||||
var/logname = input(user, "Enter desired logfile name (.log) or leave blank to cancel:")
|
||||
if(!logname || !channel)
|
||||
return TRUE
|
||||
var/datum/computer_file/data/logfile = new /datum/computer_file/data/logfile()
|
||||
// Now we will generate HTML-compliant file that can actually be viewed/printed.
|
||||
logfile.filename = logname
|
||||
logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]"
|
||||
for(var/logstring in channel.messages)
|
||||
logfile.stored_data += "[logstring]\[BR\]"
|
||||
logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]"
|
||||
logfile.calculate_size()
|
||||
if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(logfile))
|
||||
if(!computer)
|
||||
// This program shouldn't even be runnable without computer.
|
||||
crash_with("Var computer is null!")
|
||||
return TRUE
|
||||
if(!computer.hard_drive)
|
||||
computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.")
|
||||
else // In 99.9% cases this will mean our HDD is full
|
||||
computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.")
|
||||
if(href_list["PRG_renamechannel"])
|
||||
. = TRUE
|
||||
if(!operator_mode || !channel)
|
||||
return TRUE
|
||||
var/mob/living/user = usr
|
||||
var/newname = sanitize(input(user, "Enter new channel name or leave blank to cancel:"))
|
||||
if(!newname || !channel)
|
||||
return
|
||||
channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.")
|
||||
channel.title = newname
|
||||
if(href_list["PRG_deletechannel"])
|
||||
. = TRUE
|
||||
if(channel && ((channel.operator == src) || netadmin_mode))
|
||||
qdel(channel)
|
||||
channel = null
|
||||
if(href_list["PRG_setpassword"])
|
||||
. = TRUE
|
||||
if(!channel || ((channel.operator != src) && !netadmin_mode))
|
||||
return TRUE
|
||||
|
||||
var/mob/living/user = usr
|
||||
var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:"))
|
||||
if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode))
|
||||
return TRUE
|
||||
|
||||
if(newpassword == "nopassword")
|
||||
channel.password = ""
|
||||
else
|
||||
channel.password = newpassword
|
||||
if(href_list["PRG_directmessage"])
|
||||
. = TRUE
|
||||
direct_message(usr)
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/send_message()
|
||||
var/mob/living/user = usr
|
||||
if(ishuman(user))
|
||||
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] computer's screen.")
|
||||
var/message = sanitize(input(user, "Enter a message to send: ") as null|text)
|
||||
if(!message)
|
||||
return
|
||||
return message
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/add_message(var/message, var/datum/ntnet_conversation/specific_channel)
|
||||
if(!message)
|
||||
return
|
||||
var/datum/ntnet_conversation/sent_channel
|
||||
if(specific_channel)
|
||||
sent_channel = specific_channel
|
||||
var/mob/living/user = usr
|
||||
if(can_run(user, TRUE, access_network))
|
||||
netadmin_mode = TRUE
|
||||
SSvueui.check_uis_for_change(src)
|
||||
if(href_list["Reply"])
|
||||
var/mob/living/user = usr
|
||||
var/datum/ntnet_conversation/conv = locate(href_list["Reply"])
|
||||
var/message = input(user, "Enter message or leave blank to cancel: ")
|
||||
if(istype(conv) && message)
|
||||
if(ishuman(user))
|
||||
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] [computer.lexical_name]'s screen.")
|
||||
conv.cl_send(src, message, user)
|
||||
|
||||
|
||||
/datum/computer_file/program/chat_client/service_activate()
|
||||
. = ..()
|
||||
if(istype(my_user) && get_signal(NTNET_COMMUNICATION))
|
||||
activate_chat_client()
|
||||
return TRUE
|
||||
else
|
||||
sent_channel = channel
|
||||
if(!sent_channel) // panikk - geeves
|
||||
return
|
||||
sent_channel.add_message(message, username, usr)
|
||||
message_dead(FONT_SMALL("<b>([sent_channel.get_dead_title()]) [username]:</b> [message]"))
|
||||
return FALSE
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/direct_message(var/mob/user)
|
||||
var/clients = list()
|
||||
var/names = list()
|
||||
for(var/cl in ntnet_global.chat_clients - src)
|
||||
var/datum/computer_file/program/chatclient/C = cl
|
||||
if(C.set_offline)
|
||||
continue
|
||||
clients[C.username] = C
|
||||
names += C.username
|
||||
if(!length(names))
|
||||
to_chat(user, SPAN_WARNING("You are the only user with an active account!"))
|
||||
return
|
||||
var/picked = input(user, "Select with whom you would like to start a conversation.") as null|anything in names
|
||||
if(!picked)
|
||||
return
|
||||
var/datum/computer_file/program/chatclient/otherClient = clients[picked]
|
||||
if(picked)
|
||||
if(directmessagechannels[otherClient])
|
||||
channel = directmessagechannels[otherClient]
|
||||
return
|
||||
var/datum/ntnet_conversation/C = new /datum/ntnet_conversation("", TRUE)
|
||||
C.begin_direct(src, otherClient)
|
||||
channel = C
|
||||
directmessagechannels[otherClient] = C
|
||||
otherClient.directmessagechannels[src] = C
|
||||
/datum/computer_file/program/chat_client/service_deactivate()
|
||||
. = ..()
|
||||
deactivate_chat_client()
|
||||
|
||||
/datum/computer_file/program/chat_client/process_tick()
|
||||
. = ..()
|
||||
|
||||
/datum/computer_file/program/chatclient/process_tick()
|
||||
..()
|
||||
if(program_state != PROGRAM_STATE_KILLED)
|
||||
ui_header = "ntnrc_idle.gif"
|
||||
if(channel)
|
||||
// Remember the last message. If there is no message in the channel remember null.
|
||||
if(length(channel.messages) > 1) // len - 1 = 0 and that's array out of bounds
|
||||
last_message = channel.messages[channel.messages.len - 1]
|
||||
else
|
||||
last_message = null
|
||||
/datum/computer_file/program/chat_client/kill_program(var/forced = FALSE)
|
||||
return ..(forced)
|
||||
|
||||
/datum/computer_file/program/chat_client/run_program(var/mob/user)
|
||||
if(!istype(my_user))
|
||||
if(istype(computer, /obj/item/modular_computer/silicon))
|
||||
var/obj/item/modular_computer/silicon/SC = computer
|
||||
var/mob/living/silicon/S = SC.computer_host
|
||||
S.id_card.InitializeChatUser()
|
||||
my_user = S.id_card.chat_user
|
||||
else
|
||||
last_message = null
|
||||
return 1
|
||||
if(channel?.messages?.len)
|
||||
ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif"
|
||||
else
|
||||
ui_header = "ntnrc_idle.gif"
|
||||
|
||||
/datum/computer_file/program/chatclient/kill_program(var/forced = FALSE)
|
||||
if(!forced)
|
||||
var/confirm = alert("Are you sure you want to close the NTNRC Client? You will not be reachable via messaging if you do so.", "Close?", "Yes", "No")
|
||||
if((confirm != "Yes") || (CanUseTopic(usr) != STATUS_INTERACTIVE))
|
||||
return FALSE
|
||||
|
||||
ntnet_global.chat_clients -= src
|
||||
|
||||
channel = null
|
||||
..(forced)
|
||||
return TRUE
|
||||
|
||||
/datum/computer_file/program/chatclient/run_program(var/mob/user)
|
||||
if(!computer)
|
||||
return
|
||||
if(!istype(computer, /obj/item/modular_computer/silicon))
|
||||
if((!computer.registered_id && !computer.register_account(src)))
|
||||
if((!computer.registered_id && !computer.register_account(src)))
|
||||
return
|
||||
if(service_state == PROGRAM_STATE_DISABLED)
|
||||
if(!computer.enable_service(null, user, src))
|
||||
return
|
||||
if(!(src in ntnet_global.chat_clients))
|
||||
ntnet_global.chat_clients += src
|
||||
if(!username)
|
||||
username = username_from_id()
|
||||
return ..(user)
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/username_from_id()
|
||||
if(istype(computer, /obj/item/modular_computer/silicon))
|
||||
var/obj/item/modular_computer/silicon/SC = computer
|
||||
return SC.computer_host.name
|
||||
if(!computer.registered_id)
|
||||
return "Unknown"
|
||||
/datum/computer_file/program/chat_client/event_registered()
|
||||
. = ..()
|
||||
computer.registered_id.InitializeChatUser()
|
||||
my_user = computer.registered_id.chat_user
|
||||
if(service_state > PROGRAM_STATE_KILLED)
|
||||
activate_chat_client()
|
||||
|
||||
|
||||
return "[computer.registered_id.registered_name] ([computer.registered_id.assignment])"
|
||||
/datum/computer_file/program/chat_client/event_unregistered()
|
||||
. = ..()
|
||||
if(service_state > PROGRAM_STATE_KILLED)
|
||||
deactivate_chat_client()
|
||||
my_user = null
|
||||
|
||||
/datum/computer_file/program/chatclient/event_unregistered()
|
||||
..()
|
||||
computer.set_autorun(filename)
|
||||
ntnet_global.chat_clients -= src
|
||||
kill_program(TRUE)
|
||||
/datum/computer_file/program/chat_client/event_silentmode()
|
||||
. = ..()
|
||||
silent = computer.silent
|
||||
|
||||
/datum/computer_file/program/chatclient/event_silentmode()
|
||||
..()
|
||||
if(computer.silent != silent)
|
||||
silent = computer.silent
|
||||
/datum/nano_module/program/computer_chatclient
|
||||
name = "Chat Client"
|
||||
|
||||
/datum/nano_module/program/computer_chatclient/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
||||
if(!ntnet_global || !ntnet_global.chat_channels)
|
||||
return
|
||||
|
||||
var/datum/computer_file/program/chatclient/C = program
|
||||
|
||||
if(C.computer.hidden_uplink && C.syndi_auth)
|
||||
if(alert(user, "Resume or close and secure?", name, "Resume", "Close") == "Resume")
|
||||
C.computer.hidden_uplink.trigger(user)
|
||||
/datum/computer_file/program/chat_client/ui_interact(var/mob/user)
|
||||
if(computer.hidden_uplink && syndi_auth)
|
||||
if(alert(user, "Resume or close and secure?", filedesc, "Resume", "Close") == "Resume")
|
||||
computer.hidden_uplink.trigger(user)
|
||||
return
|
||||
else
|
||||
C.syndi_auth = FALSE
|
||||
syndi_auth = FALSE
|
||||
|
||||
var/list/data = list()
|
||||
if(program)
|
||||
data = list("_PC" = program.get_header_data())
|
||||
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
data["adminmode"] = C.netadmin_mode
|
||||
if(C.channel)
|
||||
data["title"] = C.channel.get_title(C)
|
||||
var/list/messages[0]
|
||||
for(var/M in C.channel.messages)
|
||||
messages.Add(list(list(
|
||||
"msg" = M
|
||||
)))
|
||||
data["messages"] = messages
|
||||
var/list/clients[0]
|
||||
for(var/datum/computer_file/program/chatclient/cl in C.channel.clients)
|
||||
clients.Add(list(list(
|
||||
"name" = cl.username,
|
||||
"active" = cl.program_state > PROGRAM_STATE_KILLED
|
||||
)))
|
||||
data["clients"] = clients
|
||||
C.operator_mode = (C.channel.operator == C) ? 1 : 0
|
||||
data["is_operator"] = C.operator_mode || C.netadmin_mode
|
||||
data["is_direct"] = C.channel.direct
|
||||
else // Channel selection screen
|
||||
var/list/all_channels[0]
|
||||
for(var/datum/ntnet_conversation/conv in ntnet_global.chat_channels)
|
||||
if(conv && conv.title && conv.can_see(program))
|
||||
all_channels.Add(list(list(
|
||||
"chan" = conv.get_title(C),
|
||||
"id" = conv.id,
|
||||
"con" = (program in conv.clients)
|
||||
)))
|
||||
data["all_channels"] = all_channels
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "ntnet_chat.tmpl", "NTNet Relay Chat Client", 575, 700, state = state)
|
||||
ui.auto_update_layout = 1
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(TRUE)
|
||||
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-chat-index", 600, 500, capitalize(filedesc))
|
||||
ui.open()
|
||||
|
||||
/datum/computer_file/program/chat_client/vueui_transfer(oldobj)
|
||||
SSvueui.transfer_uis(oldobj, src, "mcomputer-chat-index", 600, 500, capitalize(filedesc))
|
||||
return TRUE
|
||||
|
||||
/datum/computer_file/program/chat_client/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
|
||||
. = ..()
|
||||
data = . || data || list()
|
||||
// Gather data for computer header
|
||||
var/headerdata = get_header_data(data["_PC"])
|
||||
if(headerdata)
|
||||
data["_PC"] = headerdata
|
||||
. = data
|
||||
|
||||
data["service"] = service_state > PROGRAM_STATE_KILLED
|
||||
data["registered"] = istype(my_user)
|
||||
data["signal"] = get_signal(NTNET_COMMUNICATION)
|
||||
data["ringtone"] = ringtone
|
||||
data["netadmin_mode"] = netadmin_mode
|
||||
data["can_netadmin_mode"] = can_run(user, FALSE, access_network)
|
||||
|
||||
if(data["registered"] && data["service"] && data["signal"])
|
||||
data["channels"] = list()
|
||||
for(var/c in ntnet_global.chat_channels)
|
||||
var/datum/ntnet_conversation/Channel = c
|
||||
if(istype(Channel) && Channel.can_see(src))
|
||||
var/ref = ref(Channel)
|
||||
var/can_interact = Channel.can_interact(src)
|
||||
var/can_manage = Channel.can_manage(src)
|
||||
data["channels"][ref] = list(
|
||||
"title" = Channel.get_title(src),
|
||||
"direct" = Channel.direct,
|
||||
"password" = !!Channel.password,
|
||||
"can_interact" = can_interact,
|
||||
"can_manage" = can_manage
|
||||
)
|
||||
if(can_interact)
|
||||
data["channels"][ref]["msg"] = Channel.messages
|
||||
data["channels"][ref]["users"] = list()
|
||||
for(var/datum/ntnet_user/U in Channel.users)
|
||||
var/uref = ref(U)
|
||||
data["channels"][ref]["users"][uref] = U.username
|
||||
data["users"] = list()
|
||||
for(var/u in ntnet_global.chat_users)
|
||||
var/datum/ntnet_user/nUser = u
|
||||
if(nUser != my_user)
|
||||
var/ref = ref(nUser)
|
||||
data["users"][ref] = nUser.username
|
||||
return data
|
||||
|
||||
/datum/computer_file/program/chat_client/proc/activate_chat_client()
|
||||
if(!istype(my_user))
|
||||
return
|
||||
if(!(src in my_user.clients))
|
||||
my_user.clients.Add(src)
|
||||
if(!(src in ntnet_global.chat_clients))
|
||||
ntnet_global.chat_clients.Add(src)
|
||||
|
||||
/datum/computer_file/program/chat_client/proc/deactivate_chat_client()
|
||||
if(!istype(my_user))
|
||||
return
|
||||
if(src in my_user.clients)
|
||||
my_user.clients.Remove(src)
|
||||
if(src in ntnet_global.chat_clients)
|
||||
ntnet_global.chat_clients.Remove(src)
|
||||
Reference in New Issue
Block a user