AdminGroups: Potential replacement for TokenGroups.
Admin group management handler.
This commit is contained in:
parent
c1c85d36b8
commit
b5ec8e2f62
320
AdminGroups/scripting/AdminGroups.sp
Normal file
320
AdminGroups/scripting/AdminGroups.sp
Normal file
@ -0,0 +1,320 @@
|
||||
#pragma newdecls required
|
||||
|
||||
#include <sourcemod>
|
||||
#include <admingroups>
|
||||
|
||||
/* ARRAYS */
|
||||
ArrayList G_hArray_AdminGroups;
|
||||
ArrayList G_hArray_ClientGroups[MAXPLAYERS+1];
|
||||
|
||||
/* BOOLEANS */
|
||||
bool G_bClientPostAdminFilter[MAXPLAYERS+1];
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "AdminGroups",
|
||||
author = "zaCade",
|
||||
description = "Manage custom sourcemod admin groups with plugins",
|
||||
version = "1.0"
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int errorSize)
|
||||
{
|
||||
CreateNative("AdminGroups_CreateAdminGroup", Native_CreateAdminGroup);
|
||||
CreateNative("AdminGroups_DeleteAdminGroup", Native_DeleteAdminGroup);
|
||||
|
||||
CreateNative("AdminGroups_GrantAdminGroup", Native_GrantAdminGroup);
|
||||
CreateNative("AdminGroups_RevokeAdminGroup", Native_RevokeAdminGroup);
|
||||
|
||||
RegPluginLibrary("AdminGroups");
|
||||
return APLRes_Success;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnPluginStart()
|
||||
{
|
||||
G_hArray_AdminGroups = new ArrayList(128);
|
||||
|
||||
for (int client = 1; client <= MaxClients; client++)
|
||||
{
|
||||
G_hArray_ClientGroups[client] = new ArrayList(128);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnRebuildAdminCache(AdminCachePart part)
|
||||
{
|
||||
switch(part)
|
||||
{
|
||||
case(AdminCache_Groups):
|
||||
{
|
||||
CreateAdminGroups();
|
||||
}
|
||||
case(AdminCache_Admins):
|
||||
{
|
||||
CreateTimer(1.0, OnRebuildAdminCachePost, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public Action OnRebuildAdminCachePost(Handle hTimer)
|
||||
{
|
||||
for (int client = 1; client <= MaxClients; client++)
|
||||
{
|
||||
GrantAdminGroups(client);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnClientConnected(int client)
|
||||
{
|
||||
G_bClientPostAdminFilter[client] = false;
|
||||
|
||||
G_hArray_ClientGroups[client].Clear();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnClientDisconnect(int client)
|
||||
{
|
||||
G_bClientPostAdminFilter[client] = false;
|
||||
|
||||
G_hArray_ClientGroups[client].Clear();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnClientPostAdminFilter(int client)
|
||||
{
|
||||
G_bClientPostAdminFilter[client] = true;
|
||||
|
||||
GrantAdminGroups(client);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose: Create all groups (Wrapper)
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
stock void CreateAdminGroups()
|
||||
{
|
||||
if (G_hArray_AdminGroups.Length)
|
||||
{
|
||||
for (int adminGroupIndex; adminGroupIndex < G_hArray_AdminGroups.Length; adminGroupIndex++)
|
||||
{
|
||||
char group[128];
|
||||
G_hArray_AdminGroups.GetString(adminGroupIndex, group, sizeof(group));
|
||||
|
||||
CreateAdminGroup(group);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose: Create a specific group
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
stock void CreateAdminGroup(const char[] group)
|
||||
{
|
||||
GroupId GrpID;
|
||||
|
||||
if ((GrpID = FindAdmGroup(group)) == INVALID_GROUP_ID)
|
||||
{
|
||||
LogMessage("Creating new admin group %s", group);
|
||||
|
||||
GrpID = CreateAdmGroup(group);
|
||||
GrpID.ImmunityLevel = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose: Grant all groups (Wrapper)
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
stock void GrantAdminGroups(int client)
|
||||
{
|
||||
if (!G_bClientPostAdminFilter[client])
|
||||
return;
|
||||
|
||||
if (G_hArray_ClientGroups[client].Length)
|
||||
{
|
||||
for (int clientGroupIndex; clientGroupIndex < G_hArray_ClientGroups[client].Length; clientGroupIndex++)
|
||||
{
|
||||
char group[128];
|
||||
G_hArray_ClientGroups[client].GetString(clientGroupIndex, group, sizeof(group));
|
||||
|
||||
GrantAdminGroup(client, group);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose: Grant a specific group
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
stock void GrantAdminGroup(int client, const char[] group)
|
||||
{
|
||||
if (!G_bClientPostAdminFilter[client])
|
||||
return;
|
||||
|
||||
AdminId AdmID;
|
||||
GroupId GrpID;
|
||||
|
||||
if ((AdmID = GetUserAdmin(client)) == INVALID_ADMIN_ID)
|
||||
{
|
||||
LogMessage("Creating new admin for %L", client);
|
||||
|
||||
AdmID = CreateAdmin();
|
||||
SetUserAdmin(client, AdmID, true);
|
||||
}
|
||||
|
||||
if ((GrpID = FindAdmGroup(group)) != INVALID_GROUP_ID)
|
||||
{
|
||||
if (AdminInheritGroup(AdmID, GrpID))
|
||||
{
|
||||
LogMessage("%L added to group %s", client, group);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LogMessage("%L group not found %s", client, group);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public int Native_CreateAdminGroup(Handle hPlugin, int numParams)
|
||||
{
|
||||
char group[128];
|
||||
GetNativeString(1, group, sizeof(group));
|
||||
|
||||
int adminGroupIndex;
|
||||
if ((adminGroupIndex = G_hArray_AdminGroups.FindString(group)) != -1)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Group already exists. (%s) [%d]", group, adminGroupIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
G_hArray_AdminGroups.PushString(group);
|
||||
|
||||
SortADTArray(G_hArray_AdminGroups, Sort_Descending, Sort_String);
|
||||
|
||||
CreateAdminGroup(group);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public int Native_DeleteAdminGroup(Handle hPlugin, int numParams)
|
||||
{
|
||||
char group[128];
|
||||
GetNativeString(1, group, sizeof(group));
|
||||
|
||||
int adminGroupIndex;
|
||||
if ((adminGroupIndex = G_hArray_AdminGroups.FindString(group)) == -1)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Group doesnt exist. (%s) [%d]", group, adminGroupIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
G_hArray_AdminGroups.Erase(adminGroupIndex);
|
||||
|
||||
SortADTArray(G_hArray_AdminGroups, Sort_Descending, Sort_String);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public int Native_GrantAdminGroup(Handle hPlugin, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
if (client < 1 || client > MaxClients)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index. (%d)", client);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsClientConnected(client))
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not connected.", client);
|
||||
return;
|
||||
}
|
||||
|
||||
char group[128];
|
||||
GetNativeString(2, group, sizeof(group));
|
||||
|
||||
int adminGroupIndex
|
||||
if ((adminGroupIndex = G_hArray_AdminGroups.FindString(group)) == -1)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Group doesnt exist. (%s) [%d]", group, adminGroupIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
int clientGroupIndex;
|
||||
if ((clientGroupIndex = G_hArray_ClientGroups[client].FindString(group)) != -1)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Client already has group. (%s) [%d]", group, clientGroupIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
G_hArray_ClientGroups[client].PushString(group);
|
||||
|
||||
SortADTArray(G_hArray_ClientGroups[client], Sort_Descending, Sort_String);
|
||||
|
||||
GrantAdminGroup(client, group);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public int Native_RevokeAdminGroup(Handle hPlugin, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
if (client < 1 || client > MaxClients)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index. (%d)", client);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsClientConnected(client))
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Client (%d) is not connected.", client);
|
||||
return;
|
||||
}
|
||||
|
||||
char group[128];
|
||||
GetNativeString(2, group, sizeof(group));
|
||||
|
||||
int adminGroupIndex
|
||||
if ((adminGroupIndex = G_hArray_AdminGroups.FindString(group)) == -1)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Group doesnt exist. (%s) [%d]", group, adminGroupIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
int clientGroupIndex;
|
||||
if ((clientGroupIndex = G_hArray_ClientGroups[client].FindString(group)) != -1)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Client doesnt have group. (%s) [%d]", group, clientGroupIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
G_hArray_ClientGroups[client].Erase(clientGroupIndex);
|
||||
|
||||
SortADTArray(G_hArray_ClientGroups[client], Sort_Descending, Sort_String);
|
||||
}
|
34
AdminGroups/scripting/include/admingroups.inc
Normal file
34
AdminGroups/scripting/include/admingroups.inc
Normal file
@ -0,0 +1,34 @@
|
||||
#if defined _admingroups_included_
|
||||
#endinput
|
||||
#endif
|
||||
#define _admingroups_included_
|
||||
|
||||
/**
|
||||
* Create a admin group.
|
||||
*
|
||||
* @param group Name of the group to create.
|
||||
*/
|
||||
native void AdminGroups_CreateAdminGroup(const char[] group);
|
||||
|
||||
/**
|
||||
* Delete a admin group.
|
||||
*
|
||||
* @param group Name of the group to delete.
|
||||
*/
|
||||
native void AdminGroups_DeleteAdminGroup(const char[] group);
|
||||
|
||||
/**
|
||||
* Grant a admin group.
|
||||
*
|
||||
* @param client Client to grant to.
|
||||
* @param group Name of the group to grant.
|
||||
*/
|
||||
native void AdminGroups_GrantAdminGroup(int client, const char[] group);
|
||||
|
||||
/**
|
||||
* Revoke a admin group.
|
||||
*
|
||||
* @param client Client to revoke from.
|
||||
* @param group Name of the group to revoke.
|
||||
*/
|
||||
native void AdminGroups_RevokeAdminGroup(int client, const char[] group);
|
Loading…
Reference in New Issue
Block a user