Files
Bubberstation/code/modules/admin/painting_manager.dm
SkyratBot 985ad2e7b9 [MIRROR] Hardens painting saving against inconsistent state [MDB IGNORE] (#11664)
* Hardens painting saving against inconsistent state (#65024)

Should help when paintings lists gets zeroed unintentionally during the round for some reason.
Now it only deletes the painting file right before it writes the new file to prevent loss of data if anything runtimes or breaks.

* Hardens painting saving against inconsistent state

Co-authored-by: AnturK <AnturK@users.noreply.github.com>
2022-02-22 12:57:08 +00:00

98 lines
3.9 KiB
Plaintext

/datum/admins/proc/paintings_manager()
set name = "Paintings Manager"
set category = "Admin"
if(!check_rights(R_ADMIN))
return
var/datum/paintings_manager/ui = new(usr)
ui.ui_interact(usr)
/// Painting Admin Management Panel
/datum/paintings_manager
/datum/paintings_manager/ui_state(mob/user)
return GLOB.admin_state
/datum/paintings_manager/ui_close(mob/user)
qdel(src)
/datum/paintings_manager/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "PaintingAdminPanel")
ui.open()
/datum/paintings_manager/ui_assets(mob/user)
return list(
get_asset_datum(/datum/asset/simple/portraits)
)
/datum/paintings_manager/ui_data(mob/user)
. = list()
.["paintings"] = SSpersistent_paintings.painting_ui_data(filter = NONE, admin = TRUE)
/datum/paintings_manager/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
if(..())
return
if (!check_rights(R_ADMIN))
return
var/mob/user = usr
var/datum/painting/chosen_painting = locate(params["ref"]) in SSpersistent_paintings.paintings
if(!chosen_painting)
return
switch(action)
if("delete")
//Delete the png file
var/png = "data/paintings/images/[chosen_painting.md5].png"
fdel(png)
//Remove entry from paintings list
SSpersistent_paintings.paintings -= chosen_painting
SSpersistent_paintings.deleted_paintings_md5s |= chosen_painting.md5
SSpersistent_paintings.save_to_file() // Save now so we don't have broken variations if this round crashes
//Delete any painting instances in the current round
for(var/obj/structure/sign/painting/painting as anything in SSpersistent_paintings.painting_frames)
if(painting.current_canvas && painting.current_canvas.painting_metadata == chosen_painting)
QDEL_NULL(painting.current_canvas)
painting.update_appearance()
log_admin("[key_name(user)] has deleted a persistent painting made by [chosen_painting.creator_ckey].")
message_admins(span_notice("[key_name_admin(user)] has deleted persistent painting made by [chosen_painting.creator_ckey]."))
return TRUE
if("rename")
//Modify the metadata
var/old_title = chosen_painting.title
var/new_title = tgui_input_text(user, "New painting title?", "Painting Rename", chosen_painting.title)
if(!new_title)
return
chosen_painting.title = new_title
log_admin("[key_name(user)] has renamed a persistent painting made by [chosen_painting.creator_ckey] with id [chosen_painting.md5] from [old_title] to [chosen_painting.title].")
return TRUE
if("rename_author")
var/old_name = chosen_painting.creator_name
var/new_name = tgui_input_text(user, "New painting author name?", "Painting Rename", chosen_painting.creator_name)
if(!new_name)
return
chosen_painting.creator_name = new_name
log_admin("[key_name(user)] has renamed a persistent painting author made by [chosen_painting.creator_name] with id [chosen_painting.md5] from [old_name] to [chosen_painting.creator_name].")
return TRUE
if("dumpit")
//Modify the metadata
chosen_painting.patron_name = ""
chosen_painting.patron_ckey = ""
chosen_painting.credit_value = 0
log_admin("[key_name(user)] has reset patronage data on a persistent painting made by [chosen_painting.creator_ckey] with id [chosen_painting.md5].")
return TRUE
if("remove_tag")
if(chosen_painting.tags)
chosen_painting.tags -= params["tag"]
log_admin("[key_name(user)] has removed tag [params["tag"]] from persistent painting made by [chosen_painting.creator_ckey] with id [chosen_painting.md5].")
return TRUE
if("add_tag")
var/tag_name = tgui_input_text(user, "New tag name?", "Add Tag")
if(!tag_name)
return
if(!chosen_painting.tags)
chosen_painting.tags = list()
chosen_painting.tags |= tag_name
log_admin("[key_name(user)] has added tag [tag_name] to persistent painting made by [chosen_painting.creator_ckey] with id [chosen_painting.md5].")
return TRUE