/client/proc/edit_admin_permissions()
set category = "Admin"
set name = "Permissions Panel"
set desc = "Edit admin permissions"
if(!check_rights(R_PERMISSIONS))
return
usr.client.holder.edit_admin_permissions()
/datum/admins/proc/edit_admin_permissions()
if(!check_rights(R_PERMISSIONS))
return
var/datum/asset/permissions_asset = get_asset_datum(/datum/asset/simple/permissions)
permissions_asset.send(usr)
var/output = {"
Permissions Panel
| CKEY \[+\] |
RANK | PERMISSIONS |
"}
for(var/adm_ckey in GLOB.admin_datums)
var/datum/admins/D = GLOB.admin_datums[adm_ckey]
if(!D) continue
var/rank = D.rank ? D.rank : "*none*"
var/rights = rights2text(D.rights," ")
if(!rights) rights = "*none*"
output += {"
| [adm_ckey] \[-\] |
[rank] |
[rights] |
"}
/*output += ""
output += "| [adm_ckey] \[-\] | "
output += "[rank] | "
output += "[rights] | "
output += "
"*/
output += {"
Search:
"}
usr << browse(output,"window=editrights;size=600x500")
/datum/admins/proc/log_admin_rank_modification(adm_ckey, new_rank)
if(!GLOB.configuration.admin.use_database_admins)
return
if(!usr.client)
return
if(!check_rights(R_PERMISSIONS))
return
if(!SSdbcore.IsConnected())
to_chat(usr, "Failed to establish database connection")
return
if(!adm_ckey || !new_rank)
return
adm_ckey = ckey(adm_ckey)
if(!adm_ckey)
return
if(!istext(adm_ckey) || !istext(new_rank))
return
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT id FROM admin WHERE ckey=:adm_ckey", list(
"adm_ckey" = adm_ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
var/new_admin = TRUE
var/admin_id
while(select_query.NextRow())
new_admin = FALSE
admin_id = text2num(select_query.item[1])
qdel(select_query)
flag_account_for_forum_sync(adm_ckey)
if(new_admin)
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO admin (`id`, `ckey`, `admin_rank`, `level`, `flags`) VALUES (null, :adm_ckey, :new_rank, -1, 0)", list(
"adm_ckey" = adm_ckey,
"new_rank" = new_rank
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
qdel(insert_query)
var/logtxt = "Added new admin [adm_ckey] to rank [new_rank]"
var/datum/db_query/log_query = SSdbcore.NewQuery("INSERT INTO admin_log (`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (Now() , :uckey, :uip, :logtxt)", list(
"uckey" = usr.ckey,
"uip" = usr.client.address,
"logtxt" = logtxt
))
if(!log_query.warn_execute())
qdel(log_query)
return
qdel(log_query)
to_chat(usr, "New admin added.")
else
if(!isnull(admin_id) && isnum(admin_id))
var/datum/db_query/insert_query = SSdbcore.NewQuery("UPDATE admin SET admin_rank=:new_rank WHERE id=:admin_id", list(
"new_rank" = new_rank,
"admin_id" = admin_id,
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
qdel(insert_query)
var/logtxt = "Edited the rank of [adm_ckey] to [new_rank]"
var/datum/db_query/log_query = SSdbcore.NewQuery("INSERT INTO admin_log (`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (Now() , :uckey, :uip, :logtxt)", list(
"uckey" = usr.ckey,
"uip" = usr.client.address,
"logtxt" = logtxt,
))
if(!log_query.warn_execute())
qdel(log_query)
return
qdel(log_query)
to_chat(usr, "Admin rank changed.")
/datum/admins/proc/log_admin_permission_modification(adm_ckey, new_permission)
if(IsAdminAdvancedProcCall())
to_chat(usr, "Admin edit blocked: Advanced ProcCall detected.")
message_admins("[key_name(usr)] attempted to edit admin ranks via advanced proc-call")
log_admin("[key_name(usr)] attempted to edit admin ranks via advanced proc-call")
return
if(!GLOB.configuration.admin.use_database_admins)
return
if(!usr.client)
return
if(!check_rights(R_PERMISSIONS))
return
if(!SSdbcore.IsConnected())
to_chat(usr, "Failed to establish database connection")
return
if(!adm_ckey || !new_permission)
return
adm_ckey = ckey(adm_ckey)
if(!adm_ckey)
return
if(istext(new_permission))
new_permission = text2num(new_permission)
if(!istext(adm_ckey) || !isnum(new_permission))
return
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT id, flags FROM admin WHERE ckey=:adm_ckey", list(
"adm_ckey" = adm_ckey
))
if(!select_query.warn_execute())
qdel(select_query)
return
var/admin_id
var/admin_rights
while(select_query.NextRow())
admin_id = text2num(select_query.item[1])
admin_rights = text2num(select_query.item[2])
qdel(select_query)
if(!admin_id)
return
flag_account_for_forum_sync(adm_ckey)
if(admin_rights & new_permission) //This admin already has this permission, so we are removing it.
var/datum/db_query/insert_query = SSdbcore.NewQuery("UPDATE admin SET flags=:newflags WHERE id=:admin_id", list(
"newflags" = (admin_rights & ~new_permission),
"admin_id" = admin_id
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
qdel(insert_query)
var/logtxt = "Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]"
var/datum/db_query/log_query = SSdbcore.NewQuery({"
INSERT INTO admin_log (`datetime` ,`adminckey` ,`adminip` ,`log`)
VALUES (Now() , :uckey, :uip, :logtxt)"}, list(
"uckey" = usr.ckey,
"uip" = usr.client.address,
"logtxt" = logtxt
))
if(!log_query.warn_execute())
qdel(log_query)
return
qdel(log_query)
to_chat(usr, "Permission removed.")
else //This admin doesn't have this permission, so we are adding it.
var/datum/db_query/insert_query = SSdbcore.NewQuery("UPDATE admin SET flags=:newflags WHERE id=:admin_id", list(
"newflags" = (admin_rights | new_permission),
"admin_id" = admin_id
))
if(!insert_query.warn_execute())
qdel(insert_query)
return
qdel(insert_query)
var/logtxt = "Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]"
var/datum/db_query/log_query = SSdbcore.NewQuery({"
INSERT INTO admin_log (`datetime` ,`adminckey` ,`adminip` ,`log`)
VALUES (Now() , :uckey, :uip, :logtxt)"}, list(
"uckey" = usr.ckey,
"uip" = usr.client.address,
"logtxt" = logtxt
))
if(!log_query.warn_execute())
qdel(log_query)
return
qdel(log_query)
to_chat(usr, "Permission added.")
/datum/admins/proc/updateranktodb(ckey,newrank)
if(!SSdbcore.IsConnected())
return
if(!check_rights(R_PERMISSIONS))
return
var/datum/db_query/query_update = SSdbcore.NewQuery("UPDATE player SET lastadminrank=:admin_rank WHERE ckey=:ckey", list(
"admin_rank" = newrank,
"ckey" = ckey
))
if(!query_update.warn_execute())
qdel(query_update)
return
qdel(query_update)
flag_account_for_forum_sync(ckey)