Files
Aurora.3/code/modules/admin/admin_ranks.dm

229 lines
6.4 KiB
Plaintext

var/list/admin_ranks = list() //list of all ranks with associated rights
var/list/forum_groupids_to_ranks = list()
/datum/admin_rank
var/rank_name
var/group_id
var/rights
/datum/admin_rank/New(raw_data)
group_id = raw_data["role_id"]
rank_name = raw_data["name"]
rights = auths_to_rights(raw_data["auths"])
/datum/admin_rank/proc/auths_to_rights(list/auths)
. = 0
for (var/auth in auths)
switch (lowertext(auth))
if ("r_buildmode","r_build")
. |= R_BUILDMODE
if ("r_admin")
. |= R_ADMIN
if ("r_ban")
. |= R_BAN
if ("r_fun")
. |= R_FUN
if ("r_server")
. |= R_SERVER
if ("r_debug")
. |= R_DEBUG
if ("r_permissions","r_rights")
. |= R_PERMISSIONS
if ("r_possess")
. |= R_POSSESS
if ("r_stealth")
. |= R_STEALTH
if ("r_rejuv","r_rejuvinate")
. |= R_REJUVINATE
if ("r_varedit")
. |= R_VAREDIT
if ("r_sound","r_sounds")
. |= R_SOUNDS
if ("r_spawn","r_create")
. |= R_SPAWN
if ("r_moderator")
. |= R_MOD
if ("r_developer")
. |= R_DEV
if ("r_cciaa")
. |= R_CCIAA
if ("r_everything","r_host","r_all")
. |= (R_BUILDMODE | R_ADMIN | R_BAN | R_FUN | R_SERVER | R_DEBUG | R_PERMISSIONS | R_POSSESS | R_STEALTH | R_REJUVINATE | R_VAREDIT | R_SOUNDS | R_SPAWN | R_MOD | R_CCIAA | R_DEV)
else
crash_with("Unknown rank in file: [auth]")
/proc/load_admin_ranks(rank_file="config/admin_ranks.json")
admin_ranks.Cut()
forum_groupids_to_ranks.Cut()
var/list/data = json_decode(file2text(rank_file))
for (var/list/group in data)
var/datum/admin_rank/rank = new(group)
admin_ranks[rank.rank_name] = rank
forum_groupids_to_ranks["[rank.group_id]"] = rank
/hook/startup/proc/loadAdmins()
load_admin_ranks()
load_admins()
return 1
/proc/load_admins()
clear_admins()
if(config.admin_legacy_system)
//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 = text2list(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/datum/admin_rank/rank_object = admin_ranks[rank]
//create the admin datum and store it for later use
var/datum/admins/D = new /datum/admins(rank, rank_object?.rights || 0, ckey)
//find the client for a ckey if they are connected and associate them with the new admin datum
D.associate(directory[ckey])
log_debug("AdminRanks: Upaded Admins from Legacy System")
else
//The current admin system uses SQL
establish_db_connection(dbcon)
if(!dbcon.IsConnected())
error("AdminRanks: Failed to connect to database in load_admins(). Reverting to legacy system.")
log_misc("AdminRanks: Failed to connect to database in load_admins(). Reverting to legacy system.")
config.admin_legacy_system = 1
load_admins()
return
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, `rank`, flags FROM ss13_admins;")
query.Execute()
while(query.NextRow())
var/ckey = query.item[1]
var/rank = query.item[2]
var/rights = query.item[3]
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(!admin_datums)
error("AdminRanks: The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.")
log_misc("AdminRanks: 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
/proc/clear_admins()
//clear the datums references
admin_datums.Cut()
for(var/s in staff)
var/client/C = s
C.remove_admin_verbs()
C.holder = null
staff.Cut()
// Clears admins from the world config.
for (var/A in world.GetConfig("admin"))
world.SetConfig("APP/admin", A, null)
/proc/update_admins_from_api(reload_once_done=FALSE)
set background = TRUE
if (!establish_db_connection(dbcon))
log_and_message_admins("AdminRanks: Failed to connect to database in update_admins_from_api(). Carrying on with old staff lists.")
return FALSE
var/list/admins_to_push = list()
for (var/rank_name in admin_ranks)
var/datum/admin_rank/rank = admin_ranks[rank_name]
var/datum/http_request/forumuser_api/req = new()
req.prepare_roles_query(rank.group_id)
req.begin_async()
UNTIL(req.is_complete())
var/datum/http_response/resp = req.into_response()
if (resp.errored)
crash_with("Role request errored for id [rank.group_id] with: [resp.error]")
log_and_message_admins("AdminRanks: Loading admins from forumuser API FAILED. Please alert web-service maintainers immediately!")
return FALSE
for (var/datum/forum_user/user in resp.body)
admins_to_push += user
var/DBQuery/prep_query = dbcon.NewQuery("UPDATE ss13_admins SET status = 0")
prep_query.Execute()
for (var/user in admins_to_push)
insert_user_to_admins_table(user)
var/DBQuery/del_query = dbcon.NewQuery("DELETE FROM ss13_admins WHERE status = 0")
del_query.Execute()
if (reload_once_done)
load_admins()
log_debug("AdminRanks: Updated Admins from ForumUserAPI")
return TRUE
/proc/insert_user_to_admins_table(datum/forum_user/user)
if(isnull(user.ckey))
log_debug("AdminRanks: [user.forum_name] does not have a ckey linked - Ignoring")
return
var/rights = 0
for (var/group_id in (user.forum_secondary_groups + user.forum_primary_group))
var/datum/admin_rank/r = forum_groupids_to_ranks["[group_id]"]
if (r)
rights |= r.rights
var/primary_rank = "Administrator"
if (forum_groupids_to_ranks["[user.forum_primary_group]"])
var/datum/admin_rank/r = forum_groupids_to_ranks["[user.forum_primary_group]"]
primary_rank = r.rank_name
var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_admins VALUES (:ckey:, :rank:, :flags:, 1) ON DUPLICATE KEY UPDATE rank = :rank:, flags = :flags:, status = 1")
query.Execute(list("ckey" = ckey(user.ckey), "rank" = primary_rank, "flags" = rights))