mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 09:42:29 +00:00
Fixes #86784
## About The Pull Request
Although some of the issues found were a direct result from #86692
(c698196766), there was still 40% of
length-related issues that wouldn't be covered anyways that are fixed in
this PR. I.E.:
* Name inputs without `MAX_NAME_LEN`
* Desc inputs without `MAX_DESC_LEN`
* Plaque inputs without `MAX_PLAQUE_LEN`
* Some people just screwed up the arguments so it would prefill
something like "40" in the `default` var because they didn't name their
vars.
To help me audit I added a lot of `max_length` named arguments to help
people understand it better. I think it might be kinder to have a
wrapper that handles adding `MAX_MESSAGE_LEN` in a lot of these cases
but I think there is some reason for a coder to be cognitive about input
texts? Let me know what you think. I didn't update anything
admin-related from what I can recall, let me know if anything needs to
be unlimited again.
## Why It's Good For The Game
The change to `INFINITY` notwithstanding, there were still an abundance
of issues that we needed to check up on. A lot of these are filtered on
down the line but it is clear that there needs to be something to catch
these issues. Maybe we could lint to make `max_length` a mandatory
argument? I don't know if that's necessary at all but I think that the
limit should be set by the invoker due to the wide arrangement of cases
that this proc could be used in.
This could all be a big nothingburger if the aforementioned PR is
reverted but a big chunk of cases fixed in this PR need to be fixed
regardless of that since people could put in 1024 character names for
stuff like guardians (or more now with the change). Consider this
"revert agnostic".
## Changelog
🆑
fix: A lot of instances where you could fill in 1024-character names
(normal limit is 42) have been patched out, along with too-long plaque
names, too-long descriptions, and more.
/🆑
101 lines
4.2 KiB
Plaintext
101 lines
4.2 KiB
Plaintext
/// Called when the shuttle starts launching back to centcom, polls a few random players who joined the round for commendations
|
|
/datum/controller/subsystem/ticker/proc/poll_hearts()
|
|
if(!CONFIG_GET(number/commendation_percent_poll))
|
|
return
|
|
|
|
var/number_to_ask = round(LAZYLEN(GLOB.joined_player_list) * CONFIG_GET(number/commendation_percent_poll)) + rand(0,1)
|
|
if(number_to_ask == 0)
|
|
message_admins("Not enough eligible players to poll for commendations.")
|
|
return
|
|
message_admins("Polling [number_to_ask] players for commendations.")
|
|
|
|
// We need the list to be random, otherwise we'll end up always asking the same people to give out commendations.
|
|
var/list/eligible_player_list = shuffle(GLOB.joined_player_list)
|
|
|
|
for(var/i in eligible_player_list)
|
|
var/mob/check_mob = get_mob_by_ckey(i)
|
|
if(!check_mob?.mind || !check_mob.client)
|
|
continue
|
|
// maybe some other filters like bans or whatever
|
|
INVOKE_ASYNC(check_mob, TYPE_PROC_REF(/mob, query_heart), 1)
|
|
number_to_ask--
|
|
if(number_to_ask <= 0)
|
|
break
|
|
|
|
/// Once the round is actually over, cycle through the ckeys in the hearts list and give them the hearted status
|
|
/datum/controller/subsystem/ticker/proc/handle_hearts()
|
|
var/list/message = list("The following players were commended this round: ")
|
|
var/i = 0
|
|
for(var/hearted_ckey in hearts)
|
|
i++
|
|
var/mob/hearted_mob = get_mob_by_ckey(hearted_ckey)
|
|
if(!hearted_mob?.client)
|
|
continue
|
|
hearted_mob.client.adjust_heart()
|
|
message += "[hearted_ckey][i == hearts.len ? "" : ", "]"
|
|
message_admins(message.Join())
|
|
|
|
/// Ask someone if they'd like to award a commendation for the round, 3 tries to get the name they want before we give up
|
|
/mob/proc/query_heart(attempt=1)
|
|
if(!client || attempt > 3)
|
|
return
|
|
if(attempt == 1 && tgui_alert(src, "Was there another character you noticed being kind this round that you would like to anonymously thank?", "<3?", list("Yes", "No"), timeout = 30 SECONDS) != "Yes")
|
|
return
|
|
|
|
var/heart_nominee
|
|
switch(attempt)
|
|
if(1)
|
|
heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN)
|
|
if(2)
|
|
heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN)
|
|
if(3)
|
|
heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN)
|
|
|
|
if(!heart_nominee)
|
|
return
|
|
|
|
heart_nominee = LOWER_TEXT(heart_nominee)
|
|
var/list/name_checks = get_mob_by_name(heart_nominee)
|
|
if(!name_checks || name_checks.len == 0)
|
|
query_heart(attempt + 1)
|
|
return
|
|
name_checks = shuffle(name_checks)
|
|
|
|
for(var/i in name_checks)
|
|
var/mob/heart_contender = i
|
|
if(heart_contender == src)
|
|
continue
|
|
|
|
switch(tgui_alert(src, "Is this the person: [heart_contender.real_name]?", "<3?", list("Yes!", "Nope", "Cancel"), timeout = 15 SECONDS))
|
|
if("Yes!")
|
|
heart_contender.receive_heart(src)
|
|
return
|
|
if("Nope")
|
|
continue
|
|
else
|
|
return
|
|
|
|
query_heart(attempt + 1)
|
|
|
|
/*
|
|
* Once we've confirmed who we're commending, either set their status now or log it for the end of the round
|
|
*
|
|
* This used to be reversed, being named nominate_heart and being called on the mob sending the commendation and the first argument being
|
|
* the heart_recepient, but that was confusing and unintuitive, so now src is the person being commended and the sender is now the first argument.
|
|
*
|
|
* Arguments:
|
|
* * heart_sender: The reference to the mob who sent the commendation, just for the purposes of logging
|
|
* * duration: How long from the moment it's applied the heart will last
|
|
* * instant: If TRUE (or if the round is already over), we'll give them the heart status now, if FALSE, we wait until the end of the round (which is the standard behavior)
|
|
*/
|
|
/mob/proc/receive_heart(mob/heart_sender, duration = 24 HOURS, instant = FALSE)
|
|
if(!client)
|
|
return
|
|
to_chat(heart_sender, span_nicegreen("Commendation sent!"))
|
|
message_admins("[key_name(heart_sender)] commended [key_name(src)] [instant ? "(instant)" : ""]")
|
|
log_admin("[key_name(heart_sender)] commended [key_name(src)] [instant ? "(instant)" : ""]")
|
|
if(instant || SSticker.current_state == GAME_STATE_FINISHED)
|
|
client.adjust_heart(duration)
|
|
else
|
|
LAZYADD(SSticker.hearts, ckey)
|