From 9409139548ef92b0dbd1c9921cb260fc7ea3d74f Mon Sep 17 00:00:00 2001 From: nwrl Date: Mon, 25 Aug 2025 15:30:24 -0500 Subject: Flesh out logging and some error handling --- README.md | 4 +-- nameblocker.sp | 112 +++++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 88 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 20fc575..2944073 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# TF2 Name Blocker +# Sourcemod Name Blocker ## Prevent users with inappropriate names from joining your server -TF2 Name Blocker is a simple sourcemod plugin that prevents users with certain names from joining the game. +Sourcemod Name Blocker is a simple sourcemod plugin that prevents users with certain names from joining the game. ## Features diff --git a/nameblocker.sp b/nameblocker.sp index 982b3e4..97370c2 100644 --- a/nameblocker.sp +++ b/nameblocker.sp @@ -34,8 +34,6 @@ // If database locking takes too long I might need to use threaded calls, which sounds like a fucking nightmare -// TODO: Overhaul logging and print everything to console. I can't debug this as of now - #pragma newdecls required #pragma semicolon 1 @@ -102,21 +100,12 @@ enum LOGMODE { LM_TOFILE = (1<<3), // Unused, may implement later }; -void doSimpleLog(LOGMODE modeflags, bool fail=false, const char[] fmt, any ...) { +void doSimpleLog(LOGMODE modeflags = LM_MSG, bool fail=false, const char[] fmt, any ...) { if(modeflags < LM_MSG || modeflags > (LM_MSG | LM_ERROR)) { - doSimpleLog(LM_ERROR, false, " Mode oob. Expected: [%d, %d], Got: %d", LM_MSG, (LM_MSG | LM_ERROR), modeflags); + LogError(" Mode oob. Expected: [%d, %d], Got: %d", LM_MSG, (LM_MSG | LM_ERROR), modeflags); return; } - /* Got fed up enough to look at sourcemod's code as to how they deal with Format type functions and they just make a 2048 char - // long buffer instead of just using vsnprintf twice to automatically determine the size of the buffer, which is fucking lame - // as hell. Literally, just make a copy of the va_args via va_copy(), run vsnprintf() to get the number of - // characters to be written, then run it again with the copy to actually put it into a buffer. I'm sure there's a better way - // to reimplement asprintf, but it's easy as balls and takes 2 seconds. Instead we get this, and they don't even offer the - // same functionality where VFormat determines the number of bytes to be written, so I have to settle for some bullshit */ - - // This language sucks fuck dude - char buf[2048]; VFormat(buf, sizeof(buf), fmt, 3); @@ -133,7 +122,10 @@ void doSimpleLog(LOGMODE modeflags, bool fail=false, const char[] fmt, any ...) // Concatenate arguments into a single buffer int concatArgs(char[] buf, int maxbuflen, int maxarglen, int end, int start=1) { - if(maxbuflen <= 0 || start < 0) return -1; + if(maxbuflen <= 0 || start < 0) { + doSimpleLog(LM_ERROR, false, " Error: maxbuflen less than 1 or start less than 0"); + return -1; + } char[] arg = new char[maxarglen]; char[] tmp = new char[maxbuflen]; @@ -147,6 +139,7 @@ int concatArgs(char[] buf, int maxbuflen, int maxarglen, int end, int start=1) { #if defined _SMNB__DEBUG_304142124110815__VERBOSE doSimpleLog(LM_MSG, false, " Preformed concat: %s", tmp); #endif + return strcopy(buf, maxbuflen, tmp); } @@ -156,7 +149,10 @@ int registerIntConVar(ConVar& cv, int defaultVal, const char[] name, const char[ Format(tmp, sizeof(tmp), "%d", defaultVal); cv = CreateConVar(name, tmp, desc); - if(cv == null) return -1; + if(cv == null) { + doSimpleLog(LM_MSG, false, " Could not create convar \"%s\"", name); + return -1; + } cv.IntValue = defaultVal; return 0; @@ -389,7 +385,22 @@ enum MOD_MODE { }; int __modPattern__insert(int index, char[] pattern, int patternlen, int client) { - if(IsNullString(pattern) || patternlen < 0 || patternlen > PATTERN_MAX_LEN || client < 0) {return -1;} + int err = 0; + if(IsNullString(pattern)) {err |= 1<<0;} + if(patternlen < 0) {err |= 1<<1;} + if(patternlen > PATTERN_MAX_LEN) {err |= 1<<2;} + if(client < 0) {err |= 1<<3;} + + if(err) { + doSimpleLog(LM_ERROR, false, " Error: Invalid argument: %s%s%s%s", + (err & (1<<0)) ? "pattern is a null string " : "", + (err & (1<<1)) ? "patternlen is less than zero" : "", + (err & (1<<2)) ? "patternlen is greater than PATTERN_MAX_LEN" : "", + (err & (1<<3)) ? "client is less than zero" : "" + ); + return -1; + } + // This is coupled and gross either way, but this way I'm not duplicating the if statement char steamid64[STEAMID64LENGTH]; char sqlerr[512 + 1]; @@ -416,7 +427,10 @@ int __modPattern__insert(int index, char[] pattern, int patternlen, int client) if(flag) return -1; - if(aModPattern(MM_INSERT, index, pattern)) {} // TODO: Error handling + if(aModPattern(MM_INSERT, index, pattern)) { + doSimpleLog(LM_ERROR, false, " Error: aModPattern failed"); + return -1; + } // TODO: Error handling return 0; } @@ -441,12 +455,30 @@ int __modPattern__delete(int index) { if(flag) return -1; - if(aModPattern(MM_DELETE, index)) {} // TODO: Error handling + if(aModPattern(MM_DELETE, index)) { + doSimpleLog(LM_ERROR, false, " Error: aModPattern failed"); + return -1; + } // TODO: Error handling return 0; } int __modPattern__replace(int index, char[] pattern, int patternlen, int client) { - if(IsNullString(pattern) || patternlen < 0 || patternlen > PATTERN_MAX_LEN || client < 0) {return -1;} + int err = 0; + + if(IsNullString(pattern)) {err |= 1<<0;} + if(patternlen < 0) {err |= 1<<1;} + if(patternlen > PATTERN_MAX_LEN) {err |= 1<<2;} + if(client < 0) {err |= 1<<3;} + + if(err) { + doSimpleLog(LM_ERROR, false, " Error: Invalid argument(s): %s%s%s%s", + (err & (1<<0)) ? "pattern is a null string" : "", + (err & (1<<1)) ? "patternlen is less than zero" : "", + (err & (1<<2)) ? "patternlen is greater than PATTERN_MAX_LEN" : "", + (err & (1<<3)) ? "client is less than zero" : "" + ); + return -1; + } char oldpattern[PATTERN_MAX_LEN]; char steamid64[STEAMID64LENGTH]; @@ -476,13 +508,19 @@ int __modPattern__replace(int index, char[] pattern, int patternlen, int client) if(flag) return -1; - if(aModPattern(MM_REPLACE, index, pattern)) {} // TODO: Error handling + if(aModPattern(MM_REPLACE, index, pattern)) { + doSimpleLog(LM_ERROR, false, " Error: aModPattern failed"); + return -1; + } // TODO: Error handling return 0; } int modPattern(MOD_MODE mode, int index, char[] pattern="", int patternlen=-1, int client=-1) { - if(index < 0 || index > regexlist.Length) return -1; + if(index < 0 || index > regexlist.Length) { + doSimpleLog(LM_ERROR, false, " Error: Index oob. Expected: [0, %d), Got: %d", regexlist.Length, index); + return -1; + } switch(mode) { case MM_INSERT: {return __modPattern__insert(index, pattern, patternlen, client);} @@ -496,11 +534,23 @@ int modPattern(MOD_MODE mode, int index, char[] pattern="", int patternlen=-1, i } int aModPattern(MOD_MODE mode, int index, char[] pattern="", int patternlen=0) { - if(mode <= MM_UNDEF || mode >= MM_TOOBIG || index < 0 || index > patternlist.Length) return -1; + if(mode <= MM_UNDEF || mode >= MM_TOOBIG || index < 0 || index > patternlist.Length) { + doSimpleLog(LM_ERROR, false, " Error: Invalid Argument(s): %s%s", + (mode <= MM_UNDEF || mode >= MM_TOOBIG) ? "Mode OOB. Expected: [MM_DELETE, MM_REPLACE]" : "", + (index < 0 || index > patternlist.Length) ? "Index OOB. Expected: [0, patternlist.Length]" : "" + ); + return -1; + } Regex res; if(mode > MM_DELETE) { - if(IsNullString(pattern) || patternlen < 0 || patternlen > PATTERN_MAX_LEN) return -1; + if(IsNullString(pattern) || patternlen < 0 || patternlen > PATTERN_MAX_LEN) { + doSimpleLog(LM_ERROR, false, " Error: Invalid Arguments: %s%s", + (IsNullString(pattern)) ? "pattern is null " : "", + (patternlen < 0 || patternlen > PATTERN_MAX_LEN) ? "patternlen oob" : "" + ); + return -1; + } char errstr[512]; RegexError reerr; res = CompileRegex(pattern, gcvarRegexCompFlags.IntValue, errstr, sizeof(errstr), reerr); @@ -580,18 +630,28 @@ int checkName(int client) { break; } + doSimpleLog(LM_ACTION, false, " User %L \"%s\" failed name check", client, name); return 1; } int getName(int client, char[] buf, int buflen) { - if(client <= 0 || buflen <= 0) return -1; - if(IsNullString(buf)) return -1; + if(client <= 0 || buflen <= 0 || IsNullString(buf)) { + doSimpleLog(LM_ERROR, false, " Error: Invalid argument: %s%s%s", + (client <= 0) ? "client index is invalid" : "", + (buflen <= 0) ? "buflen is invalid" : "", + (IsNullString(buf)) ? "given buffer is null" : "" + ); + return -1; + } return Format(buf, buflen, "%N", client); } int handleNameHit(int client) { - if(client <= 0) return -1; + if(client <= 0) { + doSimpleLog(LM_ERROR, false, " Error: given client index is invalid. Expected: [1, inf), Got: %d", client); + return -1; + } switch(gcvarOperMode.IntValue) { case OP_DISABLED: {return 0;} -- cgit v1.2.3