replacing the admins_simple.ini with actually using the probably intended forwards to handle group overrides on player connections
This commit is contained in:
parent
60ec523d98
commit
58a5ea51a0
@ -29,6 +29,9 @@ StringMap g_GroupOverrides; // group name -> comma-separated override list
|
|||||||
static Handle g_hForwardPlayerHours;
|
static Handle g_hForwardPlayerHours;
|
||||||
static Handle g_hForwardPlayerTier;
|
static Handle g_hForwardPlayerTier;
|
||||||
|
|
||||||
|
bool G_bResponsePassed[MAXPLAYERS+1];
|
||||||
|
bool G_bPreAdminChecked[MAXPLAYERS+1];
|
||||||
|
|
||||||
public Plugin myinfo =
|
public Plugin myinfo =
|
||||||
{
|
{
|
||||||
name = "UNLOZE_player_time",
|
name = "UNLOZE_player_time",
|
||||||
@ -336,20 +339,20 @@ public void SQL_OnDatabaseConnect(Database db, const char[] error, any data)
|
|||||||
{
|
{
|
||||||
if(IsValidClient(i) && !IsFakeClient(i))
|
if(IsValidClient(i) && !IsFakeClient(i))
|
||||||
{
|
{
|
||||||
OnClientPostAdminCheck(i);
|
OnClientAuthorized(i, g_csSID[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OnMapStart();
|
OnMapStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnClientPostAdminCheck(int client)
|
public void OnClientAuthorized(int client, const char[] sSteamID32)
|
||||||
{
|
{
|
||||||
g_iPlayerNextTierHours[client] = 0;
|
g_iPlayerNextTierHours[client] = 0;
|
||||||
GetClientAuthId(client, AuthId_Steam2, g_csSID[client], sizeof(g_csSID[]));
|
GetClientAuthId(client, AuthId_Steam2, g_csSID[client], sizeof(g_csSID[]));
|
||||||
is_bot_player[client] = false;
|
is_bot_player[client] = false;
|
||||||
g_iPlayerTier[client] = -1;
|
g_iPlayerTier[client] = -1;
|
||||||
g_iPlayerTimeServer[client] = 0;
|
g_iPlayerTimeServer[client] = 0;
|
||||||
if(!IsValidClient(client) || IsFakeClient(client))
|
if(IsFakeClient(client))
|
||||||
return;
|
return;
|
||||||
if (!g_hDatabase)
|
if (!g_hDatabase)
|
||||||
{
|
{
|
||||||
@ -436,125 +439,20 @@ public void SQL_OnQueryCompletedTimeServer(Database db, DBResultSet results, con
|
|||||||
if (g_iPlayerTier[client] == -1)
|
if (g_iPlayerTier[client] == -1)
|
||||||
{
|
{
|
||||||
SetPlayerTier(client);
|
SetPlayerTier(client);
|
||||||
if (g_iPlayerTier[client] > 0)
|
G_bResponsePassed[client] = true;
|
||||||
|
if (G_bPreAdminChecked[client])
|
||||||
{
|
{
|
||||||
WritePlayerTierToFile(client); //checks if all tiers have to be written
|
NotifyPostAdminCheck(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (check_if_client_new_tier(client)) //called every 10 minutes to fill new times from DB
|
else if (check_if_client_new_tier(client))
|
||||||
{
|
{
|
||||||
SetPlayerTier(client);
|
SetPlayerTier(client);
|
||||||
WritePlayerTierToFile(client); //write only the new tier to the file at the end.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WritePlayerTierToFile(int client)
|
|
||||||
{
|
|
||||||
char sPath[PLATFORM_MAX_PATH];
|
|
||||||
BuildPath(Path_SM, sPath, sizeof(sPath), "configs/admins_simple.ini");
|
|
||||||
|
|
||||||
// --- Read entire file into memory ---
|
|
||||||
File f = OpenFile(sPath, "r");
|
|
||||||
if (!f)
|
|
||||||
{
|
|
||||||
LogError("WritePlayerTierToFile: failed to open %s for reading", sPath);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool foundSeparator = false;
|
|
||||||
//always write the steamIDs as steamID 2 format.
|
|
||||||
char sSID[64];
|
|
||||||
GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
|
|
||||||
bool write_all_tiers = true;
|
|
||||||
bool write_newest_tier = false;
|
|
||||||
|
|
||||||
char line[256];
|
|
||||||
while (f.ReadLine(line, sizeof(line)))
|
|
||||||
{
|
|
||||||
int len = strlen(line);
|
|
||||||
while (len > 0 && (line[len-1] == '\n' || line[len-1] == '\r'))
|
|
||||||
line[--len] = '\0';
|
|
||||||
|
|
||||||
if (StrEqual(line, "//here begins the unloze_play_time plugin tiers", false))
|
|
||||||
{
|
|
||||||
foundSeparator = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!foundSeparator)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each line looks like: "STEAM_0:0:12345" "@tier3"
|
|
||||||
// Extract steam ID and tier number
|
|
||||||
char steamid[65];
|
|
||||||
char group[64];
|
|
||||||
|
|
||||||
int pos = 1; //skip opening quote
|
|
||||||
int sidStart = pos;
|
|
||||||
while (line[pos] != '"')
|
|
||||||
{
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
int sidLen = pos - sidStart;
|
|
||||||
strcopy(steamid, sidLen + 1, line[sidStart]);
|
|
||||||
if (!StrEqual(steamid, sSID))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//if steam ID does not exist write all tiers
|
|
||||||
write_all_tiers = false;
|
|
||||||
write_newest_tier = true;
|
|
||||||
|
|
||||||
pos++; // skip closing quote of steamid
|
|
||||||
while (line[pos] == ' ' || line[pos] == '\t') pos++; // skip whitespace
|
|
||||||
pos++; // skip opening quote of group
|
|
||||||
|
|
||||||
int grpStart = pos;
|
|
||||||
while (line[pos] != '"') pos++;
|
|
||||||
int grpLen = pos - grpStart;
|
|
||||||
strcopy(group, grpLen + 1, line[grpStart]);
|
|
||||||
|
|
||||||
// group is "@tier3", extract tier number
|
|
||||||
char tierStr[8];
|
|
||||||
strcopy(tierStr, sizeof(tierStr), group[5]); // skip "@tier"
|
|
||||||
int tierNum = StringToInt(tierStr);
|
|
||||||
if (tierNum == g_iPlayerTier[client])
|
|
||||||
{
|
|
||||||
write_newest_tier = false;
|
|
||||||
break; //we confirmed the most recent tier was already written here.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete f;
|
|
||||||
|
|
||||||
if (write_all_tiers)
|
|
||||||
{
|
|
||||||
// Open file for appending
|
|
||||||
File fAppend = OpenFile(sPath, "a");
|
|
||||||
|
|
||||||
for (int t = 1; t <= g_iPlayerTier[client]; t++)
|
|
||||||
{
|
|
||||||
char linewrite[256];
|
|
||||||
Format(linewrite, sizeof(linewrite), "\"%s\" \"@tier%i\"\n", sSID, t);
|
|
||||||
fAppend.WriteString(linewrite, false);
|
|
||||||
}
|
|
||||||
delete fAppend;
|
|
||||||
SetTierRewards(client);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (write_newest_tier)
|
|
||||||
{
|
|
||||||
// Open file for appending
|
|
||||||
File fAppend = OpenFile(sPath, "a");
|
|
||||||
char linewrite[256];
|
|
||||||
Format(linewrite, sizeof(linewrite), "\"%s\" \"@tier%i\"\n", sSID, g_iPlayerTier[client]);
|
|
||||||
fAppend.WriteString(linewrite, false);
|
|
||||||
delete fAppend;
|
|
||||||
SetTierRewards(client);
|
SetTierRewards(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool check_if_client_new_tier(int client)
|
public bool check_if_client_new_tier(int client) //called every 10 minutes to fill new times from DB
|
||||||
{
|
{
|
||||||
char sPath[PLATFORM_MAX_PATH];
|
char sPath[PLATFORM_MAX_PATH];
|
||||||
BuildPath(Path_SM, sPath, sizeof(sPath), "configs/unloze_playt_time_tiers.cfg");
|
BuildPath(Path_SM, sPath, sizeof(sPath), "configs/unloze_playt_time_tiers.cfg");
|
||||||
@ -598,20 +496,6 @@ public bool check_if_client_new_tier(int client)
|
|||||||
return upgrade_tier;
|
return upgrade_tier;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetTierRewards(int client)
|
|
||||||
{
|
|
||||||
if (g_iPlayerTier[client] < 1)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 1; i <= g_iPlayerTier[client]; i++)
|
|
||||||
{
|
|
||||||
char groupname[64];
|
|
||||||
Format(groupname, sizeof(groupname), "tier%i", i);
|
|
||||||
AddClientToGroup(client, groupname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddClientToGroup(int client, const char[] groupName)
|
public void AddClientToGroup(int client, const char[] groupName)
|
||||||
{
|
{
|
||||||
AdminId id = GetUserAdmin(client);
|
AdminId id = GetUserAdmin(client);
|
||||||
@ -680,9 +564,7 @@ public void SetPlayerTier(int client)
|
|||||||
if (g_iPlayerTimeServer[client] < next_hours)
|
if (g_iPlayerTimeServer[client] < next_hours)
|
||||||
{
|
{
|
||||||
g_iPlayerNextTierHours[client] = next_hours - g_iPlayerTimeServer[client];
|
g_iPlayerNextTierHours[client] = next_hours - g_iPlayerTimeServer[client];
|
||||||
PrintToChat(client, "You need %i hours to reach next tier. Check your features with !sm_tier", g_iPlayerNextTierHours[client]);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
|
||||||
delete kv;
|
delete kv;
|
||||||
}
|
}
|
||||||
@ -694,6 +576,8 @@ public void OnClientDisconnect(int client)
|
|||||||
Format(g_csSID[client], sizeof(g_csSID[]), "");
|
Format(g_csSID[client], sizeof(g_csSID[]), "");
|
||||||
is_bot_player[client] = false;
|
is_bot_player[client] = false;
|
||||||
g_iPlayerTimeServer[client] = 0;
|
g_iPlayerTimeServer[client] = 0;
|
||||||
|
G_bPreAdminChecked[client] = false;
|
||||||
|
G_bResponsePassed[client] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void insert_client(int client)
|
public void insert_client(int client)
|
||||||
@ -991,3 +875,69 @@ public int Handler_Menu(Menu menu, MenuAction action, int param1, int param2)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetTierRewards(int client)
|
||||||
|
{
|
||||||
|
if (!G_bResponsePassed[client])
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintToChat(client, "You need %i hours to reach next tier. Check your features with !sm_tier", g_iPlayerNextTierHours[client]);
|
||||||
|
if (g_iPlayerTier[client] < 1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 1; i <= g_iPlayerTier[client]; i++)
|
||||||
|
{
|
||||||
|
char groupname[64];
|
||||||
|
Format(groupname, sizeof(groupname), "tier%i", i);
|
||||||
|
AddClientToGroup(client, groupname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
// Purpose:
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
public Action OnRebuildAdminCachePost(Handle hTimer)
|
||||||
|
{
|
||||||
|
for (int client = 1; client <= MaxClients; client++)
|
||||||
|
{
|
||||||
|
if(G_bResponsePassed[client] && G_bPreAdminChecked[client])
|
||||||
|
SetTierRewards(client);
|
||||||
|
}
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action OnClientPreAdminCheck(int client)
|
||||||
|
{
|
||||||
|
G_bPreAdminChecked[client] = true;
|
||||||
|
|
||||||
|
if (G_bResponsePassed[client])
|
||||||
|
{
|
||||||
|
return Plugin_Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RunAdminCacheChecks(client);
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientConnected(int client)
|
||||||
|
{
|
||||||
|
G_bPreAdminChecked[client] = false;
|
||||||
|
G_bResponsePassed[client] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientPostAdminFilter(int client)
|
||||||
|
{
|
||||||
|
SetTierRewards(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnRebuildAdminCache(AdminCachePart part)
|
||||||
|
{
|
||||||
|
if (part != AdminCache_Admins)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CreateTimer(1.0, OnRebuildAdminCachePost, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user