var/list/admin_datums = list() GLOBAL_VAR_INIT(href_token, GenerateToken()) GLOBAL_PROTECT(href_token) // todo: /datum/admin_holder /datum/admins var/rank = "Temporary Admin" var/client/owner = null var/rights = 0 // todo: rework /// If set, we are under stealth-mode with this as our public ckey. var/fakekey = null var/datum/marked_datum var/admincaster_screen = 0 //See newscaster.dm under machinery for a full description var/datum/feed_message/admincaster_feed_message = new /datum/feed_message //These two will act as holders. var/datum/feed_channel/admincaster_feed_channel = new /datum/feed_channel var/admincaster_signature //What you'll sign the newsfeeds as var/href_token var/datum/filter_editor/filteriffic var/datum/spawn_menu/spawn_menu /datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey) if(!ckey) log_world("Admin datum created without a ckey argument. Datum has been deleted") qdel(src) return rank = initial_rank rights = initial_rights admin_datums[ckey] = src if(rights & R_DEBUG) //grant profile access world.SetConfig("APP/admin", ckey, "role=admin") spawn(-1) UNTIL(SSmapping.loaded_station) admincaster_signature = "[(LEGACY_MAP_DATUM).company_name] Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" ..() // todo: assertions on this are too weak /datum/admins/proc/associate(client/C) if(owner == C) return if(owner) disassociate() if(!istype(C)) return owner = C owner.holder = src GLOB.admins |= C // add verbs add_admin_verbs() on_associate(C) // todo: assertions on this are too weak /datum/admins/proc/disassociate() if(!owner) return // for now, destroy all modals QDEL_LAZYLIST(admin_modals) // obliterate verbs remove_admin_verbs() on_disassociate(owner) GLOB.admins -= owner owner.deadmin_holder = owner.holder owner.holder = null owner = null /datum/admins/add_admin_verbs() ..() if(!owner) return var/list/verbs_to_add = list() verbs_to_add += admin_verbs_default if(rights & R_BUILDMODE) verbs_to_add += /client/proc/togglebuildmodeself if(rights & R_ADMIN) verbs_to_add += admin_verbs_admin if(rights & R_BAN) verbs_to_add += admin_verbs_ban if(rights & R_FUN) verbs_to_add += admin_verbs_fun if(rights & R_SERVER) verbs_to_add += admin_verbs_server if(rights & R_DEBUG) verbs_to_add += admin_verbs_debug if(rights & R_POSSESS) verbs_to_add += admin_verbs_possess if(rights & R_PERMISSIONS) verbs_to_add += admin_verbs_permissions if(rights & R_STEALTH) verbs_to_add += /client/proc/stealth if(rights & R_REJUVINATE) verbs_to_add += admin_verbs_rejuv if(rights & R_SOUNDS) verbs_to_add += admin_verbs_sounds if(rights & R_SPAWN) verbs_to_add += admin_verbs_spawn if(rights & R_MOD) verbs_to_add += admin_verbs_mod if(rights & R_EVENT) verbs_to_add += admin_verbs_event_manager add_verb( owner, verbs_to_add, ) /datum/admins/remove_admin_verbs() ..() if(!owner) return remove_verb( owner, list( admin_verbs_default, /client/proc/togglebuildmodeself, admin_verbs_admin, admin_verbs_ban, admin_verbs_fun, admin_verbs_server, admin_verbs_debug, admin_verbs_possess, admin_verbs_permissions, /client/proc/stealth, admin_verbs_rejuv, admin_verbs_sounds, admin_verbs_spawn, debug_verbs, ), ) /* checks if usr is an admin with at least ONE of the flags in rights_required. (Note, they don't need all the flags) if rights_required == 0, then it simply checks if they are an admin. if it doesn't return 1 and show_msg=1 it will prints a message explaining why the check has failed generally it would be used like so: proc/admin_proc() if(!check_rights(R_ADMIN)) return to_chat(world, "you have enough rights!") NOTE: It checks usr by default. Supply the "user" argument if you wish to check for a specific mob. */ /proc/check_rights(rights_required, show_msg = TRUE, var/client/C = usr) if(ismob(C)) var/mob/M = C C = M.client if(!C) return FALSE if(!(istype(C, /client))) // If we still didn't find a client, something is wrong. return FALSE if(!C.holder) if(show_msg) to_chat(C, "Error: You are not an admin.") return FALSE if(rights_required) if(rights_required & C.holder.rights) return TRUE else if(show_msg) to_chat(C, "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].") return FALSE else return TRUE /datum/admins/proc/check_for_rights(rights_required) if(rights_required && !(rights_required & rights)) return FALSE return TRUE //probably a bit iffy - will hopefully figure out a better solution /proc/check_if_greater_rights_than(client/other) if(usr && usr.client) if(usr.client.holder) if(!other || !other.holder) return 1 if(usr.client.holder.rights != other.holder.rights) if( (usr.client.holder.rights & other.holder.rights) == other.holder.rights ) return 1 //we have all the rights they have and more to_chat(usr, "Error: Cannot proceed. They have more or equal rights to us.") return 0 //This proc checks whether subject has at least ONE of the rights specified in rights_required. /proc/check_rights_for(client/subject, rights_required) if(subject?.holder) return subject.holder.check_for_rights(rights_required) return FALSE /client/proc/deadmin() if(holder) holder.disassociate() return 1 /proc/GenerateToken() . = "" for(var/I in 1 to 32) . += "[rand(10)]" /proc/RawHrefToken(forceGlobal = FALSE) var/tok = GLOB.href_token if(!forceGlobal && usr) var/client/C = usr.client if(!C) CRASH("No client for HrefToken()!") var/datum/admins/holder = C.holder if(holder) tok = holder.href_token return tok /proc/HrefToken(forceGlobal = FALSE) return "admin_token=[RawHrefToken(forceGlobal)]" /proc/HrefTokenFormField(forceGlobal = FALSE) return "" /datum/admins/proc/CheckAdminHref(href, href_list) return TRUE /* Disabled var/auth = href_list["admin_token"] . = auth && (auth == href_token || auth == GLOB.href_token) if(.) return var/msg = !auth ? "no" : "a bad" message_admins("[key_name_admin(usr)] clicked an href with [msg] authorization key!") if(CONFIG_GET(flag/debug_admin_hrefs)) message_admins("Debug mode enabled, call not blocked. Please ask your coders to review this round's logs.") log_world("UAH: [href]") return TRUE log_admin_private("[key_name(usr)] clicked an href with [msg] authorization key! [href]") */