From 72f5998a7ec429d89c96cff9e9cb04d5f966e581 Mon Sep 17 00:00:00 2001
From: gc <30398469+gc@users.noreply.github.com>
Date: Sat, 13 Jul 2024 13:14:08 +1000
Subject: [PATCH] Add badges to redis

---
 dist/TSRedis.d.ts | 10 ++++++++--
 dist/TSRedis.js   | 16 ++++++++++++++--
 src/TSRedis.ts    | 18 ++++++++++++++++--
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/dist/TSRedis.d.ts b/dist/TSRedis.d.ts
index 8b9a8a1..58ec5d9 100644
--- a/dist/TSRedis.d.ts
+++ b/dist/TSRedis.d.ts
@@ -7,12 +7,12 @@ declare const messageSchema: z.ZodUnion<[z.ZodObject<{
     channel: z.ZodEnum<["main"]>;
 }, "strip", z.ZodTypeAny, {
     type: "text";
-    text: string;
     channel: "main";
+    text: string;
 }, {
     type: "text";
-    text: string;
     channel: "main";
+    text: string;
 }>, z.ZodObject<{
     type: z.ZodLiteral<"ping">;
     channel: z.ZodEnum<["main"]>;
@@ -28,12 +28,18 @@ type Channel = z.infer<typeof channels>;
 declare const userSchema: z.ZodObject<{
     username: z.ZodNullable<z.ZodString>;
     perk_tier: z.ZodNullable<z.ZodNumber>;
+    osb_badges: z.ZodNullable<z.ZodString>;
+    bso_badges: z.ZodNullable<z.ZodString>;
 }, "strip", z.ZodTypeAny, {
     username: string | null;
     perk_tier: number | null;
+    osb_badges: string | null;
+    bso_badges: string | null;
 }, {
     username: string | null;
     perk_tier: number | null;
+    osb_badges: string | null;
+    bso_badges: string | null;
 }>;
 type RedisUser = z.infer<typeof userSchema>;
 export declare class TSRedis {
diff --git a/dist/TSRedis.js b/dist/TSRedis.js
index 1d3e1e6..da41ec4 100644
--- a/dist/TSRedis.js
+++ b/dist/TSRedis.js
@@ -4,9 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.TSRedis = void 0;
+const discord_js_1 = require("discord.js");
 const ioredis_1 = __importDefault(require("ioredis"));
 const ioredis_mock_1 = __importDefault(require("ioredis-mock"));
 const zod_1 = require("zod");
+const misc_1 = require("./util/misc");
+function cleanUsername(username) {
+    return (0, discord_js_1.escapeMarkdown)((0, misc_1.stripEmojis)(username)).substring(0, 32);
+}
 const channels = zod_1.z.enum(['main']);
 const patronUpdateMessageSchema = zod_1.z.object({
     type: zod_1.z.literal('text'),
@@ -20,7 +25,9 @@ const pingMessageSchema = zod_1.z.object({
 const messageSchema = zod_1.z.union([patronUpdateMessageSchema, pingMessageSchema]);
 const userSchema = zod_1.z.object({
     username: zod_1.z.string().nullable(),
-    perk_tier: zod_1.z.number().nullable()
+    perk_tier: zod_1.z.number().nullable(),
+    osb_badges: zod_1.z.string().nullable(),
+    bso_badges: zod_1.z.string().nullable()
 });
 class TSRedis {
     constructor(options = { mocked: false }) {
@@ -68,13 +75,18 @@ class TSRedis {
         return `user.${userID}`;
     }
     async setUser(userID, changes) {
+        if (changes.username) {
+            changes.username = cleanUsername(changes.username);
+        }
         return this.redis.hset(this.getUserHash(userID), changes);
     }
     async getUser(userID) {
         const user = await this.redis.hgetall(this.getUserHash(userID));
         return {
             username: user.username ?? null,
-            perk_tier: user.perk_tier ? Number.parseInt(user.perk_tier) : null
+            perk_tier: user.perk_tier ? Number.parseInt(user.perk_tier) : null,
+            osb_badges: user.osb_badges ?? null,
+            bso_badges: user.bso_badges ?? null
         };
     }
 }
diff --git a/src/TSRedis.ts b/src/TSRedis.ts
index 130ac79..c36d6e6 100644
--- a/src/TSRedis.ts
+++ b/src/TSRedis.ts
@@ -1,7 +1,14 @@
+import { escapeMarkdown } from 'discord.js';
 import Redis, { type RedisOptions } from 'ioredis';
 import MockRedis from 'ioredis-mock';
 import { z } from 'zod';
 
+import { stripEmojis } from './util/misc';
+
+function cleanUsername(username: string) {
+	return escapeMarkdown(stripEmojis(username)).substring(0, 32);
+}
+
 const channels = z.enum(['main']);
 
 const patronUpdateMessageSchema = z.object({
@@ -22,7 +29,9 @@ type Channel = z.infer<typeof channels>;
 
 const userSchema = z.object({
 	username: z.string().nullable(),
-	perk_tier: z.number().nullable()
+	perk_tier: z.number().nullable(),
+	osb_badges: z.string().nullable(),
+	bso_badges: z.string().nullable()
 });
 
 type RedisUser = z.infer<typeof userSchema>;
@@ -74,6 +83,9 @@ export class TSRedis {
 	}
 
 	async setUser(userID: string, changes: Partial<RedisUser>) {
+		if (changes.username) {
+			changes.username = cleanUsername(changes.username);
+		}
 		return this.redis.hset(this.getUserHash(userID), changes);
 	}
 
@@ -82,7 +94,9 @@ export class TSRedis {
 
 		return {
 			username: user.username ?? null,
-			perk_tier: user.perk_tier ? Number.parseInt(user.perk_tier) : null
+			perk_tier: user.perk_tier ? Number.parseInt(user.perk_tier) : null,
+			osb_badges: user.osb_badges ?? null,
+			bso_badges: user.bso_badges ?? null
 		};
 	}
 }