intial commit: CallAdmin

with "_" until fully ready
This commit is contained in:
Dogan 2019-10-16 22:40:28 +02:00
parent 0ee475c2b4
commit 540aaf2c95
9 changed files with 2868 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,402 @@
/**
* -----------------------------------------------------
* File calladmin_usermanager.sp
* Authors dordnung, Impact
* License GPLv3
* Web https://dordnung.de, http://gugyclan.eu
* -----------------------------------------------------
*
* CallAdmin
* Copyright (C) 2013-2018 dordnung, Impact
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#include <sourcemod>
#include "include/autoexecconfig"
#include "include/calladmin"
#include "include/calladmin_stocks"
#undef REQUIRE_PLUGIN
#include "include/updater"
#include <basecomm>
#pragma semicolon 1
#pragma newdecls required
// Version cvar
ConVar g_hVersion;
// Cvar to blacklist muted players
ConVar g_hBlacklistMuted;
bool g_bBlacklistMuted;
// Cvar to blacklist gagged players
ConVar g_hBlacklistGagged;
bool g_bBlacklistGagged;
// Cvar to show information
ConVar g_hShowInformation;
bool g_bShowInformation;
// Is immune or on blacklist?
bool g_bClientOnBlacklist[MAXPLAYERS + 1];
bool g_bClientImmune[MAXPLAYERS + 1];
// Updater
#define UPDATER_URL "http://plugins.gugyclan.eu/calladmin/calladmin_usermanager.txt"
public Plugin myinfo =
{
name = "CallAdmin UserManager",
author = "dordnung, Impact",
description = "The usermanagermodule for CallAdmin",
version = CALLADMIN_VERSION,
url = "https://dordnung.de"
}
/*
Sourcemod
*/
// Register the library
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
RegPluginLibrary("calladmin_usermanager");
// Api
CreateNative("CallAdmin_SetClientOnBlacklist", Native_SetClientOnBlacklist);
CreateNative("CallAdmin_SetClientImmune", Native_SetClientImmune);
CreateNative("CallAdmin_IsClientOnBlacklist", Native_IsClientOnBlacklist);
CreateNative("CallAdmin_IsClientImmune", Native_IsClientImmune);
return APLRes_Success;
}
public void OnConfigsExecuted()
{
g_bBlacklistMuted = g_hBlacklistMuted.BoolValue;
g_bBlacklistGagged = g_hBlacklistGagged.BoolValue;
g_bShowInformation = g_hShowInformation.BoolValue;
}
// Plugin Started
public void OnPluginStart()
{
// Create config and load it
AutoExecConfig_SetFile("plugin.calladmin_usermanager");
g_hVersion = AutoExecConfig_CreateConVar("sm_calladmin_usermanager_version", CALLADMIN_VERSION, "Plugin version", FCVAR_NOTIFY|FCVAR_DONTRECORD);
g_hBlacklistMuted = AutoExecConfig_CreateConVar("sm_calladmin_blacklist_muted", "0", "Disallow muted players to report a player", FCVAR_NONE);
g_hBlacklistGagged = AutoExecConfig_CreateConVar("sm_calladmin_blacklist_gagged", "1", "Disallow gagged players to report a player", FCVAR_NONE);
g_hShowInformation = AutoExecConfig_CreateConVar("sm_calladmin_show_information", "0", "Show status to player on mute/gag", FCVAR_NONE);
AutoExecConfig(true, "plugin.CallAdminUsermanager");
AutoExecConfig_CleanFile();
// Load translation
LoadTranslations("calladmin_usermanager.phrases");
// Set Version
g_hVersion.SetString(CALLADMIN_VERSION);
// Hook changes
g_hVersion.AddChangeHook(OnCvarChanged);
g_hBlacklistMuted.AddChangeHook(OnCvarChanged);
g_hBlacklistGagged.AddChangeHook(OnCvarChanged);
g_hShowInformation.AddChangeHook(OnCvarChanged);
}
// Convar Changed
public void OnCvarChanged(Handle cvar, const char[] oldValue, const char[] newValue)
{
if (cvar == g_hBlacklistMuted)
{
g_bBlacklistMuted = g_hBlacklistMuted.BoolValue;
// Check basecomm
if (!LibraryExists("basecomm") && g_bBlacklistMuted)
{
CallAdmin_LogMessage("Couldn't find Plugin basecomm.smx. But you've activated mute blacklisting!");
}
}
else if (cvar == g_hBlacklistGagged)
{
g_bBlacklistGagged = g_hBlacklistGagged.BoolValue;
// Check basecomm
if (!LibraryExists("basecomm") && g_hBlacklistGagged)
{
CallAdmin_LogMessage("Couldn't find Plugin basecomm.smx. But you've activated gag blacklisting!");
}
}
else if (cvar == g_hShowInformation)
{
g_bShowInformation = g_hShowInformation.BoolValue;
}
else if (cvar == g_hVersion)
{
g_hVersion.SetString(CALLADMIN_VERSION);
}
}
// Updater
public void OnAllPluginsLoaded()
{
if (LibraryExists("updater"))
{
Updater_AddPlugin(UPDATER_URL);
}
if (!LibraryExists("basecomm") && (g_bBlacklistMuted || g_bBlacklistGagged))
{
CallAdmin_LogMessage("Couldn't find Plugin basecomm.smx. But you've activated mute or gag blacklisting!");
}
}
// Updater
public void OnLibraryAdded(const char[] name)
{
if (StrEqual(name, "updater"))
{
Updater_AddPlugin(UPDATER_URL);
}
}
/*
NATIVES
*/
// Set client on blacklist
public int Native_SetClientOnBlacklist(Handle plugin, int numParams)
{
int client = GetNativeCell(1);
if (IsClientValid(client))
{
g_bClientOnBlacklist[client] = GetNativeCell(2);
}
}
// Set Client immune
public int Native_SetClientImmune(Handle plugin, int numParams)
{
int client = GetNativeCell(1);
if (IsClientValid(client))
{
g_bClientImmune[client] = GetNativeCell(2);
}
}
// Checks if the client is on the blacklist
public int Native_IsClientOnBlacklist(Handle plugin, int numParams)
{
int client = GetNativeCell(1);
if (IsClientValid(client))
{
return g_bClientOnBlacklist[client];
}
return false;
}
// Checks if the client is immune
public int Native_IsClientImmune(Handle plugin, int numParams)
{
int client = GetNativeCell(1);
if (IsClientValid(client))
{
return g_bClientImmune[client];
}
return false;
}
/*
CallAdmin
*/
// Client open the menu
public Action CallAdmin_OnDrawMenu(int client)
{
// Client is on blacklist, so don't open menu
if (g_bClientOnBlacklist[client])
{
// Info text
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientOnBlacklist");
return Plugin_Handled;
}
return Plugin_Continue;
}
// Client will drawn to menu
public Action CallAdmin_OnDrawTarget(int client, int target)
{
// Target is immune, so don't draw it
if (g_bClientImmune[target])
{
return Plugin_Handled;
}
return Plugin_Continue;
}
// Client will report
public Action CallAdmin_OnReportPre(int client, int target, const char[] reason)
{
// Target is immune, so don't report
if (g_bClientImmune[target])
{
// Info text
if (client != REPORTER_CONSOLE)
{
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_TargetImmune", target);
}
return Plugin_Handled;
}
// Client is on blacklist so don't allow report
if (client != REPORTER_CONSOLE && g_bClientOnBlacklist[client])
{
// Info text
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientOnBlacklist");
return Plugin_Handled;
}
return Plugin_Continue;
}
/*
Basecomm
*/
// Client get muted
public void BaseComm_OnClientMute(int client, bool muteState)
{
if (g_bBlacklistMuted && IsClientValid(client))
{
// Show information
if (g_bShowInformation && muteState != g_bClientOnBlacklist[client])
{
if (muteState)
{
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistMute");
}
else
{
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistRemove");
}
}
// Set client on blacklist
g_bClientOnBlacklist[client] = muteState;
}
}
// Client get gagged
public void BaseComm_OnClientGag(int client, bool gagState)
{
if (g_bBlacklistGagged && IsClientValid(client))
{
// Show information
if (g_bShowInformation && g_bClientOnBlacklist[client] != gagState)
{
if (gagState)
{
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistGag");
}
else
{
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistRemove");
}
}
// Set client on blacklist
g_bClientOnBlacklist[client] = gagState;
}
}
public void OnClientDisconnect_Post(int client)
{
g_bClientOnBlacklist[client] = false;
g_bClientImmune[client] = false;
}

View File

@ -0,0 +1,715 @@
#if defined _autoexecconfig_included
#endinput
#endif
#define _autoexecconfig_included
#include <sourcemod>
// Append
#define AUTOEXEC_APPEND_BAD_FILENAME 0
#define AUTOEXEC_APPEND_FILE_NOT_FOUND 1
#define AUTOEXEC_APPEND_BAD_HANDLE 2
#define AUTOEXEC_APPEND_SUCCESS 3
// Find
#define AUTOEXEC_FIND_BAD_FILENAME 10
#define AUTOEXEC_FIND_FILE_NOT_FOUND 11
#define AUTOEXEC_FIND_BAD_HANDLE 12
#define AUTOEXEC_FIND_NOT_FOUND 13
#define AUTOEXEC_FIND_SUCCESS 14
// Clean
#define AUTOEXEC_CLEAN_FILE_NOT_FOUND 20
#define AUTOEXEC_CLEAN_BAD_HANDLE 21
#define AUTOEXEC_CLEAN_SUCCESS 22
// General
#define AUTOEXEC_NO_CONFIG 30
// Formatter
#define AUTOEXEC_FORMAT_BAD_FILENAME 40
#define AUTOEXEC_FORMAT_SUCCESS 41
// Global variables
static char g_sConfigFile[PLATFORM_MAX_PATH];
static char g_sRawFileName[PLATFORM_MAX_PATH];
static char g_sFolderPath[PLATFORM_MAX_PATH];
static bool g_bCreateFile = false;
static Handle g_hPluginHandle = null;
// Workaround for now
static int g_iLastFindResult;
static int g_iLastAppendResult;
/**
* Returns the last result from the parser.
*
* @return Returns one of the AUTOEXEC_FIND values or -1 if not set.
*/
stock int AutoExecConfig_GetFindResult()
{
return g_iLastFindResult;
}
/**
* Returns the last result from the appender.
*
* @return Returns one of the AUTOEXEC_APPEND values or -1 if not set.
*/
stock int AutoExecConfig_GetAppendResult()
{
return g_iLastAppendResult;
}
/**
* Set if the config file should be created if it doesn't exist yet.
*
* @param create True if config file should be created, false otherwise.
* @noreturn
*/
stock void AutoExecConfig_SetCreateFile(bool create)
{
g_bCreateFile = create;
}
/**
* Returns if the config file should be created if it doesn't exist.
*
* @return Returns true, if the config file should be created or false if it should not.
*/
stock bool AutoExecConfig_GetCreateFile()
{
return g_bCreateFile;
}
/**
* Set the plugin for which the config file should be created.
* Set to null to use the calling plugin.
* Used to print the correct filename in the top comment when creating the file.
*
* @param plugin The plugin to create convars for or null to use the calling plugin.
* @noreturn
*/
stock void AutoExecConfig_SetPlugin(Handle plugin)
{
g_hPluginHandle = plugin;
}
/**
* Returns the plugin for which the config file is created.
*
* @return The plugin handle
*/
stock Handle AutoExecConfig_GetPlugin()
{
return g_hPluginHandle;
}
/**
* Set the global autoconfigfile used by functions of this file.
*
* @param file Name of the config file, path and .cfg extension is being added if not given.
* @param folder Folder under cfg/ to use. By default this is "sourcemod."
* @return True if formatter returned success, false otherwise.
*/
stock bool AutoExecConfig_SetFile(char[] file, char[] folder="sourcemod")
{
Format(g_sConfigFile, sizeof(g_sConfigFile), "%s", file);
// Global buffers for cfg execution
strcopy(g_sRawFileName, sizeof(g_sRawFileName), file);
strcopy(g_sFolderPath, sizeof(g_sFolderPath), folder);
// Format the filename
return AutoExecConfig_FormatFileName(g_sConfigFile, sizeof(g_sConfigFile), folder) == AUTOEXEC_FORMAT_SUCCESS;
}
/**
* Get the formatted autoconfigfile used by functions of this file.
*
* @param buffer String to format.
* @param size Maximum size of buffer
* @return True if filename was set, false otherwise.
*/
stock bool AutoExecConfig_GetFile(char[] buffer,int size)
{
if(strlen(g_sConfigFile) > 0)
{
strcopy(buffer, size, g_sConfigFile);
return true;
}
// Security for decl users
buffer[0] = '\0';
return false;
}
/**
* Creates a convar and appends it to the autoconfigfile if not found.
* FCVAR_DONTRECORD will be skipped.
*
* @param name Name of new convar.
* @param defaultValue String containing the default value of new convar.
* @param description Optional description of the convar.
* @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details.
* @param hasMin Optional boolean that determines if the convar has a minimum value.
* @param min Minimum floating point value that the convar can have if hasMin is true.
* @param hasMax Optional boolean that determines if the convar has a maximum value.
* @param max Maximum floating point value that the convar can have if hasMax is true.
* @return A handle to the newly created convar. If the convar already exists, a handle to it will still be returned.
* @error Convar name is blank or is the same as an existing console command.
*/
stock ConVar AutoExecConfig_CreateConVar(const char[] name, const char[] defaultValue, const char[] description="", int flags=0, bool hasMin=false, float min=0.0, bool hasMax=false, float max=0.0)
{
// If configfile was set and convar has no dontrecord flag
if(!(flags & FCVAR_DONTRECORD) && strlen(g_sConfigFile) > 0)
{
// Reset the results
g_iLastFindResult = -1;
g_iLastAppendResult = -1;
// Add it if not found
char buffer[64];
g_iLastFindResult = AutoExecConfig_FindValue(name, buffer, sizeof(buffer), true);
// We only add this convar if it doesn't exist, or the file doesn't exist and it should be auto-generated
if(g_iLastFindResult == AUTOEXEC_FIND_NOT_FOUND || (g_iLastFindResult == AUTOEXEC_FIND_FILE_NOT_FOUND && g_bCreateFile))
{
g_iLastAppendResult = AutoExecConfig_AppendValue(name, defaultValue, description, flags, hasMin, min, hasMax, max);
}
}
// Create the convar
return CreateConVar(name, defaultValue, description, flags, hasMin, min, hasMax, max);
}
/**
* Executes the autoconfigfile, and adds it to the OnConfigsExecuted forward.
* If we didn't created it already we let SourceMod create it.
*
* @noreturn
*/
stock void AutoExecConfig_ExecuteFile()
{
// Only let sourcemod create the file, if we didn't do that already.
AutoExecConfig(!g_bCreateFile, g_sRawFileName, g_sFolderPath);
}
/**
* Formats a autoconfigfile, prefixes path and adds .cfg extension if missed.
*
* @param buffer String to format.
* @param size Maximum size of buffer.
* @return Returns one of the AUTOEXEC_FORMAT values..
*/
stock static int AutoExecConfig_FormatFileName(char[] buffer, int size, char[] folder="sourcemod")
{
// No config set
if(strlen(g_sConfigFile) < 1)
{
return AUTOEXEC_NO_CONFIG;
}
// Can't be an cfgfile
if(StrContains(g_sConfigFile, ".cfg") == -1 && strlen(g_sConfigFile) < 4)
{
return AUTOEXEC_FORMAT_BAD_FILENAME;
}
// Pathprefix
char pathprefixbuffer[PLATFORM_MAX_PATH];
if(strlen(folder) > 0)
{
Format(pathprefixbuffer, sizeof(pathprefixbuffer), "cfg/%s/", folder);
}
else
{
Format(pathprefixbuffer, sizeof(pathprefixbuffer), "cfg/");
}
char filebuffer[PLATFORM_MAX_PATH];
filebuffer[0] = '\0';
// Add path if file doesn't begin with it
if(StrContains(buffer, pathprefixbuffer) != 0)
{
StrCat(filebuffer, sizeof(filebuffer), pathprefixbuffer);
}
StrCat(filebuffer, sizeof(filebuffer), g_sConfigFile);
// Add .cfg extension if file doesn't end with it
if(StrContains(filebuffer[strlen(filebuffer) - 4], ".cfg") != 0)
{
StrCat(filebuffer, sizeof(filebuffer), ".cfg");
}
strcopy(buffer, size, filebuffer);
return AUTOEXEC_FORMAT_SUCCESS;
}
/**
* Appends a convar to the global autoconfigfile
*
* @param name Name of new convar.
* @param defaultValue String containing the default value of new convar.
* @param description Optional description of the convar.
* @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details.
* @param hasMin Optional boolean that determines if the convar has a minimum value.
* @param min Minimum floating point value that the convar can have if hasMin is true.
* @param hasMax Optional boolean that determines if the convar has a maximum value.
* @param max Maximum floating point value that the convar can have if hasMax is true.
* @return Returns one of the AUTOEXEC_APPEND values
*/
stock int AutoExecConfig_AppendValue(const char[] name, const char[] defaultValue, const char[] description, int flags, bool hasMin, float min, bool hasMax, float max)
{
// No config set
if(strlen(g_sConfigFile) < 1)
{
return AUTOEXEC_NO_CONFIG;
}
char filebuffer[PLATFORM_MAX_PATH];
strcopy(filebuffer, sizeof(filebuffer), g_sConfigFile);
//PrintToServer("pathbuffer: %s", filebuffer);
bool bFileExists = FileExists(filebuffer);
if(g_bCreateFile || bFileExists)
{
// If the file already exists we open it in append mode, otherwise we use a write mode which creates the file
File fFile = OpenFile(filebuffer, (bFileExists ? "a" : "w"));
char writebuffer[2048];
if(fFile == null)
{
return AUTOEXEC_APPEND_BAD_HANDLE;
}
// We just created the file, so add some header about version and stuff
if(g_bCreateFile && !bFileExists)
{
fFile.WriteLine( "// This file was auto-generated by AutoExecConfig read and append beta");
GetPluginFilename(g_hPluginHandle, writebuffer, sizeof(writebuffer));
Format(writebuffer, sizeof(writebuffer), "// ConVars for plugin \"%s\"", writebuffer);
fFile.WriteLine(writebuffer);
}
// Spacer
fFile.WriteLine("\n");
// This is used for multiline comments
int newlines = GetCharCountInStr('\n', description);
if(newlines == 0)
{
// We have no newlines, we can write the description to the file as is
Format(writebuffer, sizeof(writebuffer), "// %s", description);
fFile.WriteLine(writebuffer);
}
else
{
char[][] newlineBuf = new char[newlines +1][2048];
ExplodeString(description, "\n", newlineBuf, newlines +1, 2048, false);
// Each newline gets a commented newline
for(int i; i <= newlines; i++)
{
if(strlen(newlineBuf[i]) > 0)
{
fFile.WriteLine("// %s", newlineBuf[i]);
}
}
}
// Descspacer
fFile.WriteLine("// -");
// Default
Format(writebuffer, sizeof(writebuffer), "// Default: \"%s\"", defaultValue);
fFile.WriteLine(writebuffer);
// Minimum
if(hasMin)
{
Format(writebuffer, sizeof(writebuffer), "// Minimum: \"%f\"", min);
fFile.WriteLine(writebuffer);
}
// Maximum
if(hasMax)
{
Format(writebuffer, sizeof(writebuffer), "// Maximum: \"%f\"", max);
fFile.WriteLine(writebuffer);
}
// Write end and defaultvalue
Format(writebuffer, sizeof(writebuffer), "%s \"%s\"", name, defaultValue);
fFile.WriteLine(writebuffer);
fFile.Close();
// Clean up the file
//AutoExecConfig_CleanFile(filebuffer, false);
return AUTOEXEC_APPEND_SUCCESS;
}
return AUTOEXEC_APPEND_FILE_NOT_FOUND;
}
/**
* Returns a convars value from the global autoconfigfile
*
* @param cvar Cvar to search for.
* @param value Buffer to store result into.
* @param size Maximum size of buffer.
* @param caseSensitive Whether or not the search should be case sensitive.
* @return Returns one of the AUTOEXEC_FIND values
*/
stock int AutoExecConfig_FindValue(const char[] cvar, char[] value, int size, bool caseSensitive=false)
{
// Security for decl users
value[0] = '\0';
// No config set
if(strlen(g_sConfigFile) < 1)
{
return AUTOEXEC_NO_CONFIG;
}
char filebuffer[PLATFORM_MAX_PATH];
strcopy(filebuffer, sizeof(filebuffer), g_sConfigFile);
//PrintToServer("pathbuffer: %s", filebuffer);
bool bFileExists = FileExists(filebuffer);
// We want to create the config file and it doesn't exist yet.
if(g_bCreateFile && !bFileExists)
{
return AUTOEXEC_FIND_FILE_NOT_FOUND;
}
if(bFileExists)
{
File fFile = OpenFile(filebuffer, "r");
int valuestart;
int valueend;
int cvarend;
// Just an reminder to self, leave the values that high
char sConvar[64];
char sValue[64];
char readbuffer[2048];
char copybuffer[2048];
if(fFile == null)
{
return AUTOEXEC_FIND_BAD_HANDLE;
}
while(!fFile.EndOfFile() && fFile.ReadLine(readbuffer, sizeof(readbuffer)))
{
// Is a comment or not valid
if(IsCharSpace(readbuffer[0]) || readbuffer[0] == '/' || !IsCharAlpha(readbuffer[0]))
{
continue;
}
// Has not enough spaces, must have at least 1
if(GetCharCountInStr(' ', readbuffer) < 1)
{
continue;
}
// Ignore cvars which aren't quoted
if(GetCharCountInStr('"', readbuffer) != 2)
{
continue;
}
// Get the start of the value
if( (valuestart = StrContains(readbuffer, "\"")) == -1 )
{
continue;
}
// Get the end of the value
if( (valueend = StrContains(readbuffer[valuestart+1], "\"")) == -1 )
{
continue;
}
// Get the start of the cvar,
if( (cvarend = StrContains(readbuffer, " ")) == -1 || cvarend >= valuestart)
{
continue;
}
// Skip if cvarendindex is before valuestartindex
if(cvarend >= valuestart)
{
continue;
}
// Convar
// Tempcopy for security
strcopy(copybuffer, sizeof(copybuffer), readbuffer);
copybuffer[cvarend] = '\0';
strcopy(sConvar, sizeof(sConvar), copybuffer);
// Value
// Tempcopy for security
strcopy(copybuffer, sizeof(copybuffer), readbuffer[valuestart+1]);
copybuffer[valueend] = '\0';
strcopy(sValue, sizeof(sValue), copybuffer);
//PrintToServer("Cvar %s has a value of %s", sConvar, sValue);
if(StrEqual(sConvar, cvar, caseSensitive))
{
Format(value, size, "%s", sConvar);
fFile.Close();
return AUTOEXEC_FIND_SUCCESS;
}
}
fFile.Close();
return AUTOEXEC_FIND_NOT_FOUND;
}
return AUTOEXEC_FIND_FILE_NOT_FOUND;
}
/**
* Cleans the global autoconfigfile from too much spaces
*
* @return One of the AUTOEXEC_CLEAN values.
*/
stock int AutoExecConfig_CleanFile()
{
// No config set
if(strlen(g_sConfigFile) < 1)
{
return AUTOEXEC_NO_CONFIG;
}
char sfile[PLATFORM_MAX_PATH];
strcopy(sfile, sizeof(sfile), g_sConfigFile);
// Security
if(!FileExists(sfile))
{
return AUTOEXEC_CLEAN_FILE_NOT_FOUND;
}
char sfile2[PLATFORM_MAX_PATH];
Format(sfile2, sizeof(sfile2), "%s_tempcopy", sfile);
char readbuffer[2048];
int count;
bool firstreached;
// Open files
File fFile1 = OpenFile(sfile, "r");
File fFile2 = OpenFile(sfile2, "w");
// Check filehandles
if(fFile1 == null || fFile2 == null)
{
if(fFile1 != null)
{
//PrintToServer("Handle1 invalid");
fFile1.Close();
}
if(fFile2 != null)
{
//PrintToServer("Handle2 invalid");
fFile2.Close();
}
return AUTOEXEC_CLEAN_BAD_HANDLE;
}
while(!fFile1.EndOfFile() && fFile1.ReadLine(readbuffer, sizeof(readbuffer)))
{
// Is space
if(IsCharSpace(readbuffer[0]))
{
count++;
}
// No space, count from start
else
{
count = 0;
}
// Don't write more than 1 space if seperation after informations have been reached
if(count < 2 || !firstreached)
{
ReplaceString(readbuffer, sizeof(readbuffer), "\n", "");
fFile2.WriteLine(readbuffer);
}
// First bigger seperation after informations has been reached
if(count == 2)
{
firstreached = true;
}
}
fFile1.Close();
fFile2.Close();
// This might be a risk, for now it works
DeleteFile(sfile);
RenameFile(sfile, sfile2);
return AUTOEXEC_CLEAN_SUCCESS;
}
/**
* Returns how many times the given char occures in the given string.
*
* @param str String to search for in.
* @return Occurences of the given char found in string.
*/
stock static int GetCharCountInStr(int character, const char[] str)
{
int len = strlen(str);
int count;
for(int i; i < len; i++)
{
if(str[i] == character)
{
count++;
}
}
return count;
}

View File

@ -0,0 +1,18 @@
/** Include guard */
#if defined _calladmin_stocks_included
#endinput
#endif
#define _calladmin_stocks_included
stock bool IsClientValid(int id)
{
if (id > 0 && id <= MaxClients && IsClientInGame(id))
{
return true;
}
return false;
}

View File

@ -0,0 +1,83 @@
/** Include guard */
#if defined _calladmin_usermanager_included
#endinput
#endif
#define _calladmin_usermanager_included
/**
* Returns whether a client is immune or not.
* If a client is immune, he can't be reported.
*
* @param client The Client.
* @return True if client is immune, false otherwise.
*/
native bool CallAdmin_IsClientImmune(int client);
/**
* Returns whether a client is on the blacklist or not.
* If a client is on the blacklist, he can't report players.
*
* @param client The Client.
* @return True if client is on blacklist, false otherwise.
*/
native bool CallAdmin_IsClientOnBlacklist(int client);
/**
* Sets whether a client is immune or not.
* If a client is immune, he can't be reported.
*
* @param client The Client.
* @param immune True to immune client, false otherwise.
* @noreturn
*/
native void CallAdmin_SetClientImmune(int client, bool immune);
/**
* Sets whether a client is in the backlist or not.
* If a client is on the blacklist, he can't report players.
*
* @param client The Client.
* @param add True to add client to blacklist, false to remove.
* @noreturn
*/
native void CallAdmin_SetClientOnBlacklist(int client, bool add);
/* Do not edit below this line */
public SharedPlugin __pl_calladmin_usermanager =
{
name = "calladmin_usermanager",
file = "calladmin_usermanager.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};
#if !defined REQUIRE_PLUGIN
public __pl_calladmin_SetNTVOptional()
{
MarkNativeAsOptional("CallAdmin_SetClientOnBlacklist");
MarkNativeAsOptional("CallAdmin_SetClientImmune");
MarkNativeAsOptional("CallAdmin_IsClientOnBlacklist");
MarkNativeAsOptional("CallAdmin_IsClientImmune");
}
#endif

View File

@ -0,0 +1,168 @@
"Phrases"
{
"CallAdmin_CommandNotAllowed"
{
"#format" "{1:d}"
"en" "You are not allowed to use this command for the next {1} seconds"
"de" "Du darfst diesen Befehl nicht innerhalb der nächsten {1} Sekunden benutzen"
"fr" "Vous ne pouvez pas utiliser cette commande avant {1} secondes"
"ru" "Вы не можете использовать эту команду в течение следующих {1} секунд"
}
"CallAdmin_HasReported"
{
"#format" "{1:N},{2:N},{3:s}"
"en" "{1} reported {2} for {3}"
"de" "{1} hat {2} wegen {3} gemeldet"
"fr" "{1} a signalé {2} pour {3}"
"ru" "{1} пожаловался на {2} по причине {3}"
}
"CallAdmin_YouHaveReported"
{
"#format" "{1:N},{2:s}"
"en" "You have reported {1} for {2}"
"de" "Du hast {1} wegen {2} gemeldet"
"fr" "Vous avez signalé {1} pour {2}"
"ru" "Вы успешно пожаловались на {1} по причине {2}"
}
"CallAdmin_NoPlayers"
{
"en" "There are no players you can report at this time"
"de" "Es sind derzeit keine Spieler vorhanden die du melden kannst"
"fr" "Aucun joueur ne peut être signalé pour le moment"
"ru" "В настоящее время на сервере нет игроков, на которых вы можете пожаловаться"
}
"CallAdmin_NotInGame"
{
"en" "Player is not on the server anymore"
"de" "Spieler ist nicht mehr auf dem Server"
"fr" "Le joueur n'est plus sur le serveur"
"ru" "Игрок уже покинул данный сервер"
}
"CallAdmin_SelectClient"
{
"en" "Select a client to report"
"de" "Wähle einen Spieler zum Melden"
"fr" "Sélectionnez un joueur à signaler"
"ru" "Выберите игрока, на которого вы хотите пожаловаться"
}
"CallAdmin_SelectReason"
{
"#format" "{1:N}"
"en" "Select a reason to report {1}"
"de" "Wähle einen Grund um {1} zu melden"
"fr" "Sélectionnez une raison pour signaler {1}"
"ru" "Выберите причину, по которой вы хотите пожаловаться на {1}"
}
// Used when exactly 1 admin is available
"CallAdmin_AdvertMessageSingular"
{
"#format" "{1:d}"
"en" "There is {1} admin available, type !call or /call in chat to report a player"
"de" "Es ist {1} Admin verfügbar, tippe !call oder /call in den Chat um einen Spieler zu melden"
"fr" "Il y a {1} admin disponible , tapez !call ou /call dans le chat pour signaler un joueur"
"ru" "Сейчас на сервере находится {1} администратор. Напишите в чате !call или /call, чтобы пожаловаться ему на игрока"
}
"CallAdmin_AdvertMessagePlural"
{
"#format" "{1:d}"
"en" "There are {1} admins available, type !call or /call in chat to report a player"
"de" "Es sind {1} Admins verfügbar, tippe !call oder /call in den Chat um einen Spieler zu melden"
"fr" "Il y a {1} admins disponibles , tapez !call ou /call dans le chat pour signaler un joueur"
"ru" "Администраторов на сервере в настоящее время: {1}. Напишите в чате !call или /call, чтобы пожаловаться на игрока"
}
"CallAdmin_OwnReason"
{
"en" "Own reason"
"de" "Eigener Grund"
"fr" "Raison personnelle"
"ru" "Другая причина"
}
"CallAdmin_TypeOwnReason"
{
"en" "You now can type your own banreason in the chat, please keep it short\nType '!noreason' or '!abort' to abort"
"de" "Du kannst nun deinen eigenen Bangrund in den Chat schreiben, fasse dich bitte kurz\nSchreibe '!noreason' oder '!abort' um abzubrechen"
"fr" "Vous pouvez maintenant écrire une raison personnelle dans le chat , écrivez une raison abrégée s'il vous plait\nEcrivez '!noreason' ou '!abort' pour annuler"
"ru" "Сейчас вы можете указать свою причину в чате. Будьте лаконичнее\nВведите '!noreason' или '!abort' для отмены"
}
"CallAdmin_CallAborted"
{
"en" "Your call has been aborted"
"de" "Der Meldevorgang wurde abgebrochen"
"fr" "Votre appel à été annulé"
"ru" "Ваша жалоба была отменена"
}
"CallAdmin_OwnReasonTooShort"
{
"en" "Your banreason is too short, please try it again"
"de" "Dein Bangrund ist zu kurz, bitte versuche es erneut"
"fr" "La raison du ban est trop courte , veuillez réessayer"
"ru" "Вы указали слишком короткую причину жалобы. Попробуйте ещё раз"
}
"CallAdmin_ConfirmCall"
{
"en" "Are you sure you want to call an admin?, abuse will be punished"
"de" "Bist du sicher dass du einen Admin rufen willst?, Missbrauch wird bestraft"
"fr" "Voulez-vous vraiment appeler un admin ?, les abus seront sanctionnés"
"ru" "Вы уверены, что хотите отправить жалобу администратору? Помните, что существует наказание за ложные вызовы"
}
"CallAdmin_Yes"
{
"en" "Yes"
"de" "Ja"
"fr" "Oui"
"ru" "Да"
}
"CallAdmin_No"
{
"en" "No"
"de" "Nein"
"fr" "Non"
"ru" "Нет"
}
"CallAdmin_AlreadyReported"
{
"en" "Player was already reported"
"de" "Spieler wurde bereits gemeldet"
"fr" "Joueur déjà signalé"
"ru" "На этого игрока уже пожаловались"
}
"CallAdmin_IngameAdminNotified"
{
"en" "An admin in-game was notified about your report"
"de" "Ein Admin in-game wurde über deine Meldung benachrichtigt"
"fr" "Un admin en jeu a été notifié de votre signalement"
"ru" "Администраторы, находящиеся на сервере, были проинформированы о вашей жалобе"
}
"CallAdmin_AdminNotification"
{
"#format" "{1:N},{2:N},{3:s}"
"en" "Player {1} reported {2} for {3}"
"de" "Spieler {1} hat {2} wegen {3} gemeldet"
"fr" "Le joueur {1} à signalé {2} pour {3}"
"ru" "Игрок {1} пожаловался на {2} по причине {3}"
}
"CallAdmin_ReportAlreadyHandled"
{
"en" "This report was already handled"
"de" "Diese Meldung wurde bereits erledigt"
"ru" "Эта жалоба уже была рассмотрена"
}
"CallAdmin_NoAdmin"
{
"en" "Only admins have access to this command"
"de" "Nur Admins können diesen Befehl ausführen"
"ru" "Только администраторы имеют доступ к этой команде"
}
"CallAdmin_WrongNumberOfArguments"
{
"en" "You've used a wrong number of arguments"
"de" "Du hast eine falsche Anzahl an Argumenten benutzt"
"ru" "Указано неправильное количество аргументов"
}
"CallAdmin_WrongReportID"
{
"en" "You've used a wrong report id"
"de" "Du hast eine falsche Melde-id benutzt"
"ru" "Указан неправильный ID жалобы"
}
}

View File

@ -0,0 +1,34 @@
"Phrases"
{
"CallAdmin_ClientBlacklistMute"
{
"en" "You are now, because of muting, on the blacklist. You can't report players anymore!"
"de" "Aufgrund eines Mutes bist du nun auf der Blacklist. Du kannst jetzt keine Spieler mehr reporten!"
"ru" "Из-за того, что вам был отключён микрофон, вы попали в чёрный список и больше не можете жаловаться на других игроков!"
}
"CallAdmin_ClientBlacklistGag"
{
"en" "You are now, because of gagging, on the blacklist. You can't report players anymore!"
"de" "Aufgrund eines Maulkorbes bist du nun auf der Blacklist. Du kannst jetzt keine Spieler mehr reporten!"
"ru" "Из-за того, что вам был отключён чат, вы попали в чёрный список и больше не можете жаловаться на других игроков!"
}
"CallAdmin_ClientBlacklistRemove"
{
"en" "You got removed from blacklist. You can report players again!"
"de" "Du wurdest von der Blacklist entfernt. Du kannst jetzt wieder Spieler reporten!"
"ru" "Вы были удалены из чёрного списка и теперь снова можете жаловаться на других игроков!"
}
"CallAdmin_ClientOnBlacklist"
{
"en" "You are currently on the blacklist. You can't report players!"
"de" "Du bist zurzeit auf der Blacklist. Du kannst keine Spieler reporten!"
"ru" "Вы находитесь в чёрном списке и не можете жаловаться на других игроков!"
}
"CallAdmin_TargetImmune"
{
"#format" "{1:N}"
"en" "Player {1} is immune. You can't report him."
"de" "Spieler {1} ist Immun. Du kannst ihn nicht reporten!"
"ru" "У игрока {1} есть иммунитет. Вы не можете жаловаться на него."
}
}