Files
vgstation13/code/modules/admin/admin_ranks.dm
2025-05-12 21:25:46 +01:00

206 lines
5.2 KiB
Plaintext

var/list/admin_ranks = list() //list of all ranks with associated rights
//load our rank - > rights associations
/proc/load_admin_ranks()
admin_ranks.len = 0
var/previous_rights = 0
//load text from file
var/list/Lines = file2list("config/admin_ranks.txt")
//process each line seperately
for(var/line in Lines)
if(!length(line))
continue
if(copytext(line,1,2) == "#")
continue
var/list/List = splittext(line,"+")
if(!List.len)
continue
var/rank = ckeyEx(List[1])
switch(rank)
if(null,"")
continue
if("Removed")
continue //Reserved
var/rights = 0
for(var/i=2, i<=List.len, i++)
switch(ckey(List[i]))
if("@","prev")
rights |= previous_rights
if("buildmode","build")
rights |= R_BUILDMODE
if("admin")
rights |= R_ADMIN
if("ban")
rights |= R_BAN
if("fun")
rights |= R_FUN
if("server")
rights |= R_SERVER
if("debug")
rights |= R_DEBUG
if("permissions","rights")
rights |= R_PERMISSIONS
if("polling", "poll")
rights |= R_POLLING
if("possess")
rights |= R_POSSESS
if("stealth")
rights |= R_STEALTH
if("rejuv","rejuvenate")
rights |= R_REJUVENATE
if("varedit")
rights |= R_VAREDIT
if("everything","host","all")
rights |= R_HOST
if("sound","sounds")
rights |= R_SOUNDS
if("spawn","create")
rights |= R_SPAWN
if("mod")
rights |= R_MOD
if("adminbus","bus")
rights |= R_ADMINBUS
admin_ranks[rank] = rights
previous_rights = rights
#ifdef TESTING
var/msg = "Permission Sets Built:\n"
for(var/rank in admin_ranks)
msg += "\t[rank] - [admin_ranks[rank]]\n"
//testing(msg)
#endif
/proc/load_admins()
//clear the datums references
admin_datums.len = 0
for(var/client/C in admins)
C.remove_admin_verbs()
C.holder = null
admins.len = 0
// Clear profiler and debug access.
for(var/A in world.GetConfig("admin"))
world.SetConfig("APP/admin", A, null)
if(config.admin_legacy_system)
load_admin_ranks()
//load text from file
var/list/Lines = file2list("config/admins.txt")
//process each line seperately
for(var/line in Lines)
if(!length(line))
continue
if(copytext(line,1,2) == "#")
continue
//Split the line at every "-"
var/list/List = splittext(line, "-")
if(!List.len)
continue
//ckey is before the first "-"
var/ckey = ckey(List[1])
if(!ckey)
continue
//rank follows the first "-"
var/rank = ""
if(List.len >= 2)
rank = ckeyEx(List[2])
//load permissions associated with this rank
var/rights = admin_ranks[rank]
//create the admin datum and store it for later use
var/datum/admins/D = new /datum/admins(rank, rights, ckey)
//find the client for a ckey if they are connected and associate them with the new admin datum
D.associate(directory[ckey])
if(D.rights & (R_DEBUG|R_SERVER)) // Grant profile/reboot access
world.SetConfig("APP/admin", ckey, "role=admin")
else
//The current admin system uses SQL
if(!SSdbcore.Connect())
world.log << "Failed to connect to database in load_admins(). Reverting to legacy system."
diary << "Failed to connect to database in load_admins(). Reverting to legacy system."
config.admin_legacy_system = 1
load_admins()
return
var/datum/DBQuery/query = SSdbcore.NewQuery("SELECT ckey, rank, level, flags FROM erro_admin")
if(!query.Execute(FALSE))
message_admins("Error: [query.ErrorMsg()]")
log_sql("Error: [query.ErrorMsg()]")
qdel(query)
return
while(query.NextRow())
var/ckey = query.item[1]
var/rank = query.item[2]
if(rank == "Removed")
continue //This person was de-adminned. They are only in the admin list for archive purposes.
var/rights = query.item[4]
if(istext(rights))
rights = text2num(rights)
var/datum/admins/D = new /datum/admins(rank, rights, ckey)
//find the client for a ckey if they are connected and associate them with the new admin datum
D.associate(directory[ckey])
if(D.rights & (R_DEBUG|R_SERVER)) // Grant profile/reboot access
world.SetConfig("APP/admin", ckey, "role=admin")
qdel(query)
if(!admin_datums)
world.log << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system."
diary << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system."
config.admin_legacy_system = 1
load_admins()
return
#ifdef TESTING
var/msg = "Admins Built:\n"
for(var/ckey in admin_datums)
var/rank
var/datum/admins/D = admin_datums[ckey]
if(D)
rank = D.rank
msg += "\t[ckey] - [rank]\n"
testing(msg)
#endif
#ifdef TESTING
/client/verb/changerank(newrank in admin_ranks)
if(holder)
holder.rank = newrank
holder.rights = admin_ranks[newrank]
else
holder = new /datum/admins(newrank,admin_ranks[newrank],ckey)
remove_admin_verbs()
holder.associate(src)
/client/verb/changerights(newrights as num)
if(holder)
holder.rights = newrights
else
holder = new /datum/admins("testing",newrights,ckey)
remove_admin_verbs()
holder.associate(src)
#endif
/proc/update_byond_admin(var/ckey)
var/datum/admins/D = admin_datums[ckey]
world.SetConfig("APP/admin", ckey, null)
if (D && D.rights & (R_SERVER|R_DEBUG))
world.SetConfig("APP/admin", ckey, "role=admin")