From 5b5e0a86a1f2963e1b726da0a7090b6a5710feda Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Mon, 6 May 2019 12:13:58 -0700 Subject: [PATCH 1/9] Add messages window --- code/modules/admin/verbs/adminpm.dm | 72 +++++++++++++++++++++++++++ code/modules/client/client defines.dm | 1 + 2 files changed, 73 insertions(+) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index e9d813c1439..68a2155da69 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -130,6 +130,9 @@ var/recieve_message = "" + pm_tracker.add_message(C, src, msg, mob) + C.pm_tracker.add_message(src, src, msg, C.mob) + if(holder && !C.holder) recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) @@ -233,3 +236,72 @@ continue if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]") + +/client/verb/open_pms_ui() + set name = "My PMs" + set category = "OOC" + pm_tracker.show_ui(usr) + +/datum/pm_tracker + var/list/pms = list() + var/current_title = "" + var/open = FALSE + var/window_id = "pms_window" + +/datum/pm_tracker/proc/add_message(var/client/title, var/client/sender, var/message, mob/user) + if(!pms[title.key]) + pms[title.key] = list() + pms[title.key].Add("[sender]: [message]") + + if(!open) + // The next time the window's opened, it'll be open to the most recent message + current_title = title.key + return + + // If it's already opened, it'll refresh + show_ui(user) + +/datum/pm_tracker/proc/show_ui(mob/user) + var/dat = "" + + dat += "Refresh" + dat += "
" + for(var/title in pms) + var/label = "[title]" + if(title == current_title) + label = "[label]" + dat += "[label]" + + dat += "

[current_title]

" + + dat += "" + + for(var/message in pms[current_title]) + dat += "" + + dat += "
[message]


" + dat += "Reply" + + var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src) + popup.set_content(dat) + popup.open() + open = TRUE + +/datum/pm_tracker/Topic(href, href_list) + if(href_list["refresh"]) + show_ui(usr) + return + + if(href_list["newtitle"]) + current_title = href_list["newtitle"] + show_ui(usr) + return + + if(href_list["reply"]) + usr.client.cmd_admin_pm(ckey(href_list["reply"]), null) + show_ui(usr) + return + + if(href_list["close"]) + open = FALSE + return diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 00900fe5fd1..1ab6ae5d9b8 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -7,6 +7,7 @@ var/last_message = "" //contains the last message sent by this client - used to protect against copy-paste spamming. var/last_message_count = 0 //contains a number of how many times a message identical to last_message was sent. var/last_message_time = 0 //holds the last time (based on world.time) a message was sent + var/datum/pm_tracker/pm_tracker = new() ///////// //OTHER// From a127f00b5a7036ce0d76ed9915d4d99b13794316 Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Mon, 6 May 2019 18:12:32 -0700 Subject: [PATCH 2/9] Add h4 tag to make things blue --- code/modules/admin/verbs/adminpm.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 68a2155da69..0fdd3d356f5 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -273,13 +273,15 @@ dat += "[label]" dat += "

[current_title]

" - + dat += "

" dat += "" for(var/message in pms[current_title]) dat += "" - dat += "
[message]


" + dat += "" + dat += "
" + dat += "

" dat += "Reply" var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src) From c669d642d4cbbfb077d5cc59fc3008330a922a13 Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Mon, 6 May 2019 19:32:17 -0700 Subject: [PATCH 3/9] Add archiving and admin buttons --- code/modules/admin/verbs/adminpm.dm | 55 ++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 0fdd3d356f5..baed06dafc7 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -243,15 +243,25 @@ pm_tracker.show_ui(usr) /datum/pm_tracker - var/list/pms = list() var/current_title = "" var/open = FALSE + var/list/pms = list() + var/show_archived = FALSE var/window_id = "pms_window" +/datum/pm_convo + var/list/messages = list() + var/archived = FALSE + var/client/client + +/datum/pm_convo/New(var/client/C) + client = C + /datum/pm_tracker/proc/add_message(var/client/title, var/client/sender, var/message, mob/user) if(!pms[title.key]) - pms[title.key] = list() - pms[title.key].Add("[sender]: [message]") + pms[title.key] = new /datum/pm_convo(title) + pms[title.key].messages.Add("[sender]: [message]") + pms[title.key].archived = FALSE if(!open) // The next time the window's opened, it'll be open to the most recent message @@ -265,31 +275,47 @@ var/dat = "" dat += "Refresh" + dat += "[show_archived ? "Hide" : "Show"] Archived" dat += "
" for(var/title in pms) + if(pms[title].archived && !show_archived) + continue var/label = "[title]" if(title == current_title) label = "[label]" dat += "[label]" - dat += "

[current_title]

" - dat += "

" - dat += "" + if(pms[current_title]) + dat += "

[check_rights(R_ADMIN, FALSE, user) ? fancy_title(current_title) : current_title]

" + dat += "

" + dat += "

" - for(var/message in pms[current_title]) - dat += "" + for(var/message in pms[current_title].messages) + dat += "" - dat += "
[message]
[message]
" - dat += "
" - dat += "

" - dat += "Reply" + dat += "" + dat += "
" + dat += "" + dat += "Reply" + dat += "[pms[current_title].archived ? "Unarchive" : "Archive"]" var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src) popup.set_content(dat) popup.open() open = TRUE +/datum/pm_tracker/proc/fancy_title(var/title) + var/client/C = pms[title].client + if(!C) + return "[title] (Disconnected)" + return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (CA)" + /datum/pm_tracker/Topic(href, href_list) + if(href_list["archive"]) + pms[href_list["archive"]].archived = !pms[href_list["archive"]].archived + show_ui(usr) + return + if(href_list["refresh"]) show_ui(usr) return @@ -304,6 +330,11 @@ show_ui(usr) return + if(href_list["showarchived"]) + show_archived = !show_archived + show_ui(usr) + return + if(href_list["close"]) open = FALSE return From fcc4216ccd65cdfa60b70fa6494ccc0cd6c43b47 Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Mon, 6 May 2019 20:36:42 -0700 Subject: [PATCH 4/9] Add unread indicator --- code/modules/admin/verbs/adminpm.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index baed06dafc7..e41791a2695 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -253,15 +253,20 @@ var/list/messages = list() var/archived = FALSE var/client/client + var/read = FALSE /datum/pm_convo/New(var/client/C) client = C +/datum/pm_convo/proc/add(var/client/sender, var/message) + messages.Add("[sender]: [message]") + archived = FALSE + read = FALSE + /datum/pm_tracker/proc/add_message(var/client/title, var/client/sender, var/message, mob/user) if(!pms[title.key]) pms[title.key] = new /datum/pm_convo(title) - pms[title.key].messages.Add("[sender]: [message]") - pms[title.key].archived = FALSE + pms[title.key].add(sender, message) if(!open) // The next time the window's opened, it'll be open to the most recent message @@ -283,9 +288,12 @@ var/label = "[title]" if(title == current_title) label = "[label]" + else if(!pms[title].read) + label = "*[label]" dat += "[label]" if(pms[current_title]) + pms[current_title].read = TRUE dat += "

[check_rights(R_ADMIN, FALSE, user) ? fancy_title(current_title) : current_title]

" dat += "

" dat += "" From a6045d14ad554777fc9f9d7232fa940cf891f3e9 Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Tue, 7 May 2019 16:43:11 -0700 Subject: [PATCH 5/9] Highlight active tab --- code/modules/admin/verbs/adminpm.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index e41791a2695..3f0bc9a14be 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -286,11 +286,13 @@ if(pms[title].archived && !show_archived) continue var/label = "[title]" + var/class = "" if(title == current_title) label = "[label]" + class = "linkOn" else if(!pms[title].read) label = "*[label]" - dat += "[label]" + dat += "[label]" if(pms[current_title]) pms[current_title].read = TRUE From 81611966278249ff5c061ab501451264deef62ee Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Wed, 8 May 2019 09:43:22 -0700 Subject: [PATCH 6/9] Allow admins to force open conversation --- code/modules/admin/verbs/adminpm.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 3f0bc9a14be..db30bed37b3 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -308,6 +308,8 @@ dat += "" dat += "Reply" dat += "[pms[current_title].archived ? "Unarchive" : "Archive"]" + if(check_rights(R_ADMIN, FALSE, user)) + dat += "Ping" var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src) popup.set_content(dat) @@ -335,6 +337,16 @@ show_ui(usr) return + if(href_list["ping"]) + var/client/C = pms[href_list["ping"]].client + if(C) + C.pm_tracker.current_title = usr.key + window_flash(C) + C.pm_tracker.show_ui(C.mob) + to_chat(usr, "Forced open [C]'s messages window.") + show_ui(usr) + return + if(href_list["reply"]) usr.client.cmd_admin_pm(ckey(href_list["reply"]), null) show_ui(usr) From e5c2dfe535049459af88d71f189ad76541092f1e Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Wed, 8 May 2019 11:37:55 -0700 Subject: [PATCH 7/9] Add typing indicator --- code/modules/admin/verbs/adminpm.dm | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index db30bed37b3..a13ba9fd276 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -88,7 +88,9 @@ //get message text, limit it's length.and clean/escape html if(!msg) + set_typing(C, TRUE) msg = input(src,"Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]") as text|null + set_typing(C, FALSE) if(!msg) return @@ -242,6 +244,16 @@ set category = "OOC" pm_tracker.show_ui(usr) +/client/proc/set_typing(client/target, var/value) + if(!target) + return + var/datum/pm_convo/convo = target.pm_tracker.pms[key] + if(!convo) + return + convo.typing = value + if(target.pm_tracker.open && target.pm_tracker.current_title == key) + target.pm_tracker.show_ui(target.mob) + /datum/pm_tracker var/current_title = "" var/open = FALSE @@ -254,16 +266,17 @@ var/archived = FALSE var/client/client var/read = FALSE + var/typing = FALSE /datum/pm_convo/New(var/client/C) client = C -/datum/pm_convo/proc/add(var/client/sender, var/message) +/datum/pm_convo/proc/add(client/sender, var/message) messages.Add("[sender]: [message]") archived = FALSE read = FALSE -/datum/pm_tracker/proc/add_message(var/client/title, var/client/sender, var/message, mob/user) +/datum/pm_tracker/proc/add_message(client/title, client/sender, var/message, mob/user) if(!pms[title.key]) pms[title.key] = new /datum/pm_convo(title) pms[title.key].add(sender, message) @@ -294,20 +307,23 @@ label = "*[label]" dat += "[label]" - if(pms[current_title]) - pms[current_title].read = TRUE + var/datum/pm_convo/convo = pms[current_title] + if(convo) + convo.read = TRUE dat += "

[check_rights(R_ADMIN, FALSE, user) ? fancy_title(current_title) : current_title]

" dat += "

" dat += "

" - for(var/message in pms[current_title].messages) + for(var/message in convo.messages) dat += "" dat += "
[message]
" + if(convo.typing) + dat += "[current_title] is typing..." dat += "
" dat += "

" dat += "Reply" - dat += "[pms[current_title].archived ? "Unarchive" : "Archive"]" + dat += "[convo.archived ? "Unarchive" : "Archive"]" if(check_rights(R_ADMIN, FALSE, user)) dat += "Ping" From 27e4ca3d1975a7a7baca4f5cfc59918896d76680 Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Wed, 8 May 2019 12:47:37 -0700 Subject: [PATCH 8/9] Animate typing indicator --- code/modules/admin/verbs/adminpm.dm | 2 +- html/browser/common.css | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index a13ba9fd276..f0c1d6316cf 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -319,7 +319,7 @@ dat += "" if(convo.typing) - dat += "[current_title] is typing..." + dat += "[current_title] is typing" dat += "
" dat += "" dat += "Reply" diff --git a/html/browser/common.css b/html/browser/common.css index 23b675f7fa2..ac093b87c61 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -345,4 +345,20 @@ div.notice -ms-interpolation-mode: nearest-neighbor; width: 64px; height:64px; -} \ No newline at end of file +} + +.typing:after +{ + overflow: hidden; + display: inline-block; + vertical-align: bottom; + animation: ellipsis steps(4,end) 900ms infinite; + content: "\2026"; + width: 0px; +} + +@keyframes ellipsis { + to { + width: 1.25em; + } +} From 8131b3976c32c42cec91881247d5c65cfe24bd1a Mon Sep 17 00:00:00 2001 From: tayyyyyyy Date: Thu, 9 May 2019 10:29:32 -0700 Subject: [PATCH 9/9] Fix style --- code/modules/admin/verbs/adminpm.dm | 10 +++++----- html/browser/common.css | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index f0c1d6316cf..caa051f8748 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -244,7 +244,7 @@ set category = "OOC" pm_tracker.show_ui(usr) -/client/proc/set_typing(client/target, var/value) +/client/proc/set_typing(client/target, value) if(!target) return var/datum/pm_convo/convo = target.pm_tracker.pms[key] @@ -268,15 +268,15 @@ var/read = FALSE var/typing = FALSE -/datum/pm_convo/New(var/client/C) +/datum/pm_convo/New(client/C) client = C -/datum/pm_convo/proc/add(client/sender, var/message) +/datum/pm_convo/proc/add(client/sender, message) messages.Add("[sender]: [message]") archived = FALSE read = FALSE -/datum/pm_tracker/proc/add_message(client/title, client/sender, var/message, mob/user) +/datum/pm_tracker/proc/add_message(client/title, client/sender, message, mob/user) if(!pms[title.key]) pms[title.key] = new /datum/pm_convo(title) pms[title.key].add(sender, message) @@ -332,7 +332,7 @@ popup.open() open = TRUE -/datum/pm_tracker/proc/fancy_title(var/title) +/datum/pm_tracker/proc/fancy_title(title) var/client/C = pms[title].client if(!C) return "[title] (Disconnected)" diff --git a/html/browser/common.css b/html/browser/common.css index ac093b87c61..3480183d129 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -357,8 +357,10 @@ div.notice width: 0px; } -@keyframes ellipsis { - to { +@keyframes ellipsis +{ + to + { width: 1.25em; } }