mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 01:49:19 +00:00
Upload files
This commit is contained in:
@@ -140,3 +140,6 @@ GLOBAL_VAR_INIT(cmp_field, "name")
|
||||
|
||||
/proc/cmp_typepaths_asc(A, B)
|
||||
return sorttext("[B]","[A]")
|
||||
|
||||
/proc/cmp_playtime(list/A, list/B)
|
||||
return A["playtime"] - B["playtime"]
|
||||
|
||||
68
code/modules/admin/playtimes.dm
Normal file
68
code/modules/admin/playtimes.dm
Normal file
@@ -0,0 +1,68 @@
|
||||
/datum/player_playtime/New(mob/viewer)
|
||||
ui_interact(viewer)
|
||||
|
||||
/datum/player_playtime/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "PlayerPlaytimes", "Player Playtimes")
|
||||
ui.open()
|
||||
|
||||
/datum/player_playtime/ui_state(mob/user)
|
||||
return GLOB.admin_state
|
||||
|
||||
/datum/player_playtime/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
var/list/clients = list()
|
||||
for(var/client/C in GLOB.clients)
|
||||
var/list/client = list()
|
||||
|
||||
client["ckey"] = C.ckey
|
||||
client["playtime"] = C.get_exp_living(TRUE)
|
||||
client["playtime_hours"] = C.get_exp_living()
|
||||
|
||||
var/mob/M = C.mob
|
||||
client["observer"] = isobserver(M)
|
||||
client["ingame"] = !isnewplayer(M)
|
||||
client["name"] = M.real_name
|
||||
var/nnpa = CONFIG_GET(number/notify_new_player_age)
|
||||
if(nnpa >= 0)
|
||||
if(C.account_age >= 0 && (C.account_age < CONFIG_GET(number/notify_new_player_age)))
|
||||
client["new_account"] = "New BYOND account [C.account_age] day[(C.account_age==1?"":"s")] old, created on [C.account_join_date]"
|
||||
|
||||
clients += list(client)
|
||||
|
||||
clients = sortList(clients, /proc/cmp_playtime)
|
||||
data["clients"] = clients
|
||||
return data
|
||||
|
||||
/datum/player_playtime/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("view_playtime")
|
||||
var/mob/target = get_mob_by_ckey(params["ckey"])
|
||||
usr.client.holder.cmd_show_exp_panel(target.client)
|
||||
if("admin_pm")
|
||||
usr.client.cmd_admin_pm(params["ckey"])
|
||||
if("player_panel")
|
||||
var/mob/target = get_mob_by_ckey(params["ckey"])
|
||||
usr.client.holder.show_player_panel(target)
|
||||
if("view_variables")
|
||||
var/mob/target = get_mob_by_ckey(params["ckey"])
|
||||
usr.client.debug_variables(target)
|
||||
if("observe")
|
||||
if(!isobserver(usr) && !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/mob/target = get_mob_by_key(params["ckey"])
|
||||
if(!target)
|
||||
to_chat(usr, "<span class='notice'>Player not found.</span>")
|
||||
return
|
||||
|
||||
var/client/C = usr.client
|
||||
if(!isobserver(usr) && !C.admin_ghost())
|
||||
return
|
||||
var/mob/dead/observer/A = C.mob
|
||||
A.ManualFollow(target)
|
||||
@@ -1557,6 +1557,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
/client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are.
|
||||
set category = "Admin"
|
||||
set name = "Player Playtime"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -1564,12 +1565,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
to_chat(usr, "<span class='warning'>Tracking is disabled in the server configuration file.</span>")
|
||||
return
|
||||
|
||||
var/list/msg = list()
|
||||
msg += "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Playtime Report</title></head><body>Playtime:<BR><UL>"
|
||||
for(var/client/C in GLOB.clients)
|
||||
msg += "<LI> - [key_name_admin(C)]: <A href='?_src_=holder;[HrefToken()];getplaytimewindow=[REF(C.mob)]'>" + C.get_exp_living() + "</a></LI>"
|
||||
msg += "</UL></BODY></HTML>"
|
||||
src << browse(msg.Join(), "window=Player_playtime_check")
|
||||
new /datum/player_playtime(usr)
|
||||
|
||||
/obj/effect/temp_visual/fireball
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
|
||||
@@ -1472,6 +1472,7 @@
|
||||
#include "code\modules\admin\outfits.dm"
|
||||
#include "code\modules\admin\permissionedit.dm"
|
||||
#include "code\modules\admin\player_panel.dm"
|
||||
#include "code\modules\admin\playtimes.dm"
|
||||
#include "code\modules\admin\sound_emitter.dm"
|
||||
#include "code\modules\admin\sql_message_system.dm"
|
||||
#include "code\modules\admin\stickyban.dm"
|
||||
|
||||
119
tgui/packages/tgui/interfaces/PlayerPlaytimes.js
Normal file
119
tgui/packages/tgui/interfaces/PlayerPlaytimes.js
Normal file
@@ -0,0 +1,119 @@
|
||||
import { useBackend } from '../backend';
|
||||
import { Button, Icon, Section, Table, Tooltip } from '../components';
|
||||
import { Window } from '../layouts';
|
||||
|
||||
export const PlayerPlaytimes = (props, context) => {
|
||||
const { act, data } = useBackend(context);
|
||||
const {
|
||||
clients,
|
||||
} = data;
|
||||
return (
|
||||
<Window
|
||||
title="Player Playtimes"
|
||||
width={600}
|
||||
height={700}
|
||||
resizable>
|
||||
<Window.Content scrollable>
|
||||
<Section>
|
||||
<Table>
|
||||
<Table.Row>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
<Icon name="clock" />
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
Ckey
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
Real Name
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
Actions
|
||||
</center>
|
||||
</Table.Cell>
|
||||
</Table.Row>
|
||||
{clients.map(client => (
|
||||
<Table.Row key={client.name} class="Table__row candystripe">
|
||||
<Table.Cell>
|
||||
<center>
|
||||
<Button
|
||||
content={client.playtime_hours}
|
||||
color="transparent"
|
||||
tooltip="View playtime for this player"
|
||||
tooltipPosition="bottom"
|
||||
onClick={() => act('view_playtime', {
|
||||
ckey: client.ckey,
|
||||
})} />
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
{!!client.new_account
|
||||
&& (
|
||||
<Tooltip content={client.new_account}>
|
||||
<Icon name="sparkles" />
|
||||
</Tooltip>
|
||||
)} {client.ckey}
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
{!!client.observer
|
||||
&& (
|
||||
<Tooltip content="This player is observing">
|
||||
<Icon name="ghost" />
|
||||
</Tooltip>
|
||||
)} {client.name}
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<center>
|
||||
<Button
|
||||
content={<b>PM</b>}
|
||||
color="transparent"
|
||||
tooltip="Send a private message to this player"
|
||||
tooltipPosition="bottom"
|
||||
onClick={() => act('admin_pm', {
|
||||
ckey: client.ckey,
|
||||
})} />
|
||||
<Button
|
||||
icon="user"
|
||||
color="transparent"
|
||||
tooltip="Open player panel"
|
||||
tooltipPosition="bottom"
|
||||
onClick={() => act('player_panel', {
|
||||
ckey: client.ckey,
|
||||
})} />
|
||||
<Button
|
||||
icon="terminal"
|
||||
color="transparent"
|
||||
tooltip="View Variables"
|
||||
tooltipPosition="bottom"
|
||||
onClick={() => act('view_variables', {
|
||||
ckey: client.ckey,
|
||||
})} />
|
||||
<Button
|
||||
icon="ghost"
|
||||
color="transparent"
|
||||
tooltip="Admin-follow"
|
||||
tooltipPosition="bottom"
|
||||
onClick={() => act('observe', {
|
||||
ckey: client.ckey,
|
||||
})} />
|
||||
</center>
|
||||
</Table.Cell>
|
||||
<br />
|
||||
</Table.Row>
|
||||
))}
|
||||
</Table>
|
||||
</Section>
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user