From e82de90e16a9be53abc13a372a2d7be1724e8ce6 Mon Sep 17 00:00:00 2001 From: nwrl Date: Sat, 9 Aug 2025 20:44:41 -0500 Subject: Implement aModPattern --- nameblocker.sp | 52 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/nameblocker.sp b/nameblocker.sp index 9611efa..af544a1 100644 --- a/nameblocker.sp +++ b/nameblocker.sp @@ -366,7 +366,7 @@ int __modPattern__replace(int index, char[] pattern, int patternlen, int client) char oldpattern[PATTERN_MAX_LEN]; patternlist.GetString(index, oldpattern, sizeof(oldpattern), ByteCountToCells(PATTERN_MAX_LEN)); - char steamid64[STEAMID64LENGTH]; + char steamid64[STEAMID64LENGTH + 1]; if(GetClientAuthId(client, AuthId_SteamID64, steamid64, sizeof(steamid64))) {} // TODO: Error handling SQL_LockDatabase(db); @@ -397,23 +397,58 @@ 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) { - LogError("aModPattern not implemented"); return -1; - if(mode <= MM_UNDEF || mode >= MM_TOOBIG || index < 0 || index > patternlist.Length) return -1; + Regex res; if(mode > MM_DELETE) { if(IsNullString(pattern) || patternlen < 0 || patternlen > PATTERN_MAX_LEN) return -1; char errstr[512]; RegexError reerr; - Regex res = CompileRegex(pattern, gcvarRegexCompFlags.IntValue, errstr, sizeof(errstr), reerr); + res = CompileRegex(pattern, gcvarRegexCompFlags.IntValue, errstr, sizeof(errstr), reerr); if(res == null) { LogError("Error: Could not compile regex pattern \"%s\": %s (%d)", pattern, errstr, reerr); return -1; } } + switch(mode) { + case MM_DELETE: { + regexlist.Erase(index); + patternlist.Erase(index); + + } + + case MM_INSERT: { + if(index == regexlist.Length) { + regexlist.Push(res); + patternlist.Push(pattern); + return 0; + } + + regexlist.ShiftUp(index); + patternlist.ShiftUp(index); + regexlist.Set(index, res); + patternlist.Set(index, pattern); + } + + case MM_REPLACE: { + if(index == regexlist.Length) { + regexlist.Push(res); + patternlist.Push(pattern); + return 0; + } + + CloseHandle(view_as(regexlist.Get(index, ByteCountToCells(HANDLE_SIZE)))); + patternlist.Set(index, pattern, ByteCountToCells(PATTERN_MAX_LEN)); + regexlist.Set(index, res, ByteCountToCells(HANDLE_SIZE)); + } + default: { + logAndFail("Got impossible state"); + } + } + return 0; } @@ -435,15 +470,6 @@ int aModPattern(MOD_MODE mode, int index, char[] pattern="", int patternlen=0) { // return 0; // } -// int aRemovePattern(int index) { -// if(index < 0 || index >= regexlist.Length) return -1; - -// regexlist.Erase(index); -// patternlist.Erase(index); - -// return 0; -// } - // Check's a user's name against the regex list. Returns -1 on error, 0 if skipped, 1 on hit -- cgit v1.2.3