diff --git a/AdminGroups/scripting/AdminGroups.sp b/AdminGroups/scripting/AdminGroups.sp new file mode 100644 index 00000000..bde0e9f5 --- /dev/null +++ b/AdminGroups/scripting/AdminGroups.sp @@ -0,0 +1,320 @@ +#pragma newdecls required + +#include +#include + +/* 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); +} diff --git a/AdminGroups/scripting/include/admingroups.inc b/AdminGroups/scripting/include/admingroups.inc new file mode 100644 index 00000000..4092cf75 --- /dev/null +++ b/AdminGroups/scripting/include/admingroups.inc @@ -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);