Files
Aurora.3/code/modules/client/preferences_notification.dm
skull132 0b6120c1ac Server Greeting Refactor (#1034)
Refactors the Server Greeting datum to do majority of the processing clientside. No longer will we be holding massive spans of text in memory, and looking over them for shits and giggles.
2016-11-06 13:59:22 +02:00

199 lines
5.6 KiB
Plaintext

/*
* A simple datum for storing notifications for dispaly.
*/
/datum/client_notification
var/datum/preferences/owner = null
var/list/note_wrapper = list()
var/note_text = ""
var/proc_src = null
var/proc_name = ""
var/proc_args = null
var/persistent = 0
/datum/client_notification/New(var/datum/preferences/prefs, var/list/new_wrapper, var/new_text, var/new_persistence)
if (!prefs)
qdel(src)
return
if (!new_wrapper || new_wrapper.len != 2)
qdel(src)
return
if (!new_text)
qdel(src)
return
owner = prefs
note_wrapper = new_wrapper
note_text = new_text
note_text = replacetextEx(note_text, ":src_ref", "\ref[src]")
note_wrapper[1] = replacetextEx(note_wrapper[1], ":src_ref", "\ref[src]")
if (new_persistence)
persistent = new_persistence
/datum/client_notification/Destroy()
if (owner)
owner.notifications -= src
owner = null
..()
/*
* Associates a callback to be executed whenever a notification is dismissed.
*/
/datum/client_notification/proc/tie_callback(var/dismiss_proc_src, var/dismiss_proc, var/dismiss_proc_args)
if (!dismiss_proc_src || !dismiss_proc)
return
proc_src = dismiss_proc_src
proc_name = dismiss_proc
if (dismiss_proc_args)
proc_args = dismiss_proc_args
/*
* Returns the HTML required to display this alert.
*/
/datum/client_notification/proc/get_html()
var/html = "<div class=\"row\">[note_wrapper[1]]"
if (!persistent)
html += "<a href=\"#\" class=\"close\" data-dismiss=\"alert\" aria-label=\"close\">&times;</a>"
html += note_text
html += "[note_wrapper[2]]</div>"
return html
/*
* Dismisses the notification, executing the proc that was set up as necessary.
*/
/datum/client_notification/proc/dismiss()
if (proc_src && proc_name)
call(proc_src, proc_name)(proc_args)
if (!persistent)
qdel(src)
/*
* Adds a new notification datum for later processing.
*/
/datum/preferences/proc/new_notification(var/type, var/text, var/persistent, var/callback_src, var/callback_proc, var/callback_args)
if (!text)
return
var/list/wrapper
switch (type)
if ("success")
wrapper = list("<div class=\"alert alert-success\" notification=\":src_ref\">", "</div>")
if ("info")
wrapper = list("<div class=\"alert alert-info\" notification=\":src_ref\">", "</div>")
if ("warning")
wrapper = list("<div class=\"alert alert-warning\" notification=\":src_ref\">", "</div>")
if ("danger")
wrapper = list("<div class=\"alert alert-danger\" notification=\":src_ref\">", "</div>")
else
wrapper = list("<div class=\"alert alert-info\" notification=\":src_ref\">", "</div>")
var/datum/client_notification/note = new(src, wrapper, text, persistent)
if (callback_src && callback_proc)
note.tie_callback(callback_src, callback_proc, callback_args)
notifications += note
/*
* Gathers all notifications relevant to the client.
*/
/datum/preferences/proc/gather_notifications(var/client/user)
if (!user)
return
if (user.byond_version < config.client_warn_version)
var/version_warn = ""
version_warn += "<b>Your version of BYOND may be out of date!</b><br>"
version_warn += config.client_warn_message
version_warn += "Your version: [user.byond_version].<br>"
version_warn += "Required version to remove this message: [config.client_warn_version] or later.<br>"
version_warn += "Visit http://www.byond.com/download/ to get the latest version of BYOND."
new_notification("danger", version_warn)
if (custom_event_msg && custom_event_msg != "")
var/custom_event_warn = "<b><center>A custom event is taking place!</center></b><br>"
custom_event_warn += "<b>OOC Info:</b><br>[custom_event_msg]"
new_notification("danger", custom_event_warn)
if (lastchangelog != changelog_hash)
winset(user, "rpane.changelog", "background-color=#eaeaea;font-style=bold")
if (config.aggressive_changelog)
new_notification("info", "You have unread updates in the changelog.", callback_src = user, callback_proc = "changes")
else
new_notification("info", "You have unread updates in the changelog.")
if (config.sql_enabled)
var/list/warnings = user.warnings_gather()
if (warnings["unread"])
new_notification("danger", warnings["unread"], 1)
if (warnings["expired"])
new_notification("info", warnings["expired"])
var/linking = user.gather_linking_requests()
if (linking)
new_notification("info", linking, callback_src = user, callback_proc = "check_linking_requests")
var/cciaa_actions = count_ccia_actions(user)
if (cciaa_actions)
new_notification("info", cciaa_actions)
/*
* Helper proc for getting a count of active CCIA actions against the player's character.
*/
/datum/preferences/proc/count_ccia_actions(var/client/user)
if (!user)
return null
if (!establish_db_connection(dbcon))
error("Error initiatlizing database connection while counting CCIA actions.")
return null
var/DBQuery/prep_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey")
prep_query.Execute(list(":ckey" = user.ckey))
var/list/chars = list()
while (prep_query.NextRow())
chars += text2num(prep_query.item[1])
if (!chars.len)
return null
var/DBQuery/query = dbcon.NewQuery({"SELECT
COUNT(act_chr.action_id) AS action_count
FROM ss13_ccia_action_char act_chr
JOIN ss13_characters chr ON act_chr.char_id = chr.id
JOIN ss13_ccia_actions act ON act_chr.action_id = act.id
WHERE
act_chr.char_id IN :char_id AND
(act.expires_at IS NULL OR act.expires_at >= CURRENT_DATE()) AND
act.deleted_at IS NULL;"})
query.Execute(list(":char_id" = chars))
if (query.NextRow())
var/action_count = text2num(query.item[1])
if (action_count == 0)
return null
var/string = "There are [action_count] active CCIA actions currently active against your character(s)."
return string
return null