From 87e8a4295d30e35b7d03967c8da6fa99f973fad4 Mon Sep 17 00:00:00 2001 From: Ale Date: Fri, 15 Mar 2024 18:41:08 +0100 Subject: [PATCH] changed alter to model --- ...arAlterChange.ts => avatarMemberChange.ts} | 15 +++--- ...lorAlterChange.ts => colorMemberChange.ts} | 19 ++++---- .../{createAlter.ts => createMember.ts} | 19 ++++---- src/commands/deleteAlter.ts | 24 ---------- src/commands/deleteMember.ts | 25 ++++++++++ src/commands/listAlters.ts | 16 ------- src/commands/listMember.ts | 19 ++++++++ .../{migrateAlters.ts => migrateMember.ts} | 11 +++-- src/index.ts | 29 ++++++++---- src/models/{alterModel.ts => MemberModel.ts} | 4 +- src/models/User.ts | 7 +++ .../{AlterRepo.ts => MemberRepo.ts} | 24 +++++----- src/utils/checkAutoProxy.ts | 15 ++++++ src/utils/commandHandler.ts | 33 +++++++------ src/utils/nonCommandHandler.ts | 47 ++----------------- src/utils/sendAsMemberHandler.ts | 47 +++++++++++++++++++ 16 files changed, 205 insertions(+), 149 deletions(-) rename src/commands/{avatarAlterChange.ts => avatarMemberChange.ts} (53%) rename src/commands/{colorAlterChange.ts => colorMemberChange.ts} (50%) rename src/commands/{createAlter.ts => createMember.ts} (72%) delete mode 100644 src/commands/deleteAlter.ts create mode 100644 src/commands/deleteMember.ts delete mode 100644 src/commands/listAlters.ts create mode 100644 src/commands/listMember.ts rename src/commands/{migrateAlters.ts => migrateMember.ts} (76%) rename src/models/{alterModel.ts => MemberModel.ts} (68%) create mode 100644 src/models/User.ts rename src/repositories/{AlterRepo.ts => MemberRepo.ts} (62%) create mode 100644 src/utils/checkAutoProxy.ts create mode 100644 src/utils/sendAsMemberHandler.ts diff --git a/src/commands/avatarAlterChange.ts b/src/commands/avatarMemberChange.ts similarity index 53% rename from src/commands/avatarAlterChange.ts rename to src/commands/avatarMemberChange.ts index 873a35f..cd0c649 100644 --- a/src/commands/avatarAlterChange.ts +++ b/src/commands/avatarMemberChange.ts @@ -1,10 +1,11 @@ -import { AlterModel } from "../models/alterModel" -import { AlterRepo } from "../repositories/AlterRepo" +import { Database } from "sqlite3"; +import MemberModel from "../models/MemberModel" +import { MemberRepo } from "../repositories/MemberRepo" -export async function avatarAlterChange(userId: string, args: string[]){ - const alterRepo = new AlterRepo(); - let userAlters : AlterModel[] = []; - await alterRepo.getAltersByUserId(userId).then( result => userAlters = result ) +export async function avatarMemberChange(userId: string, args: string[], database: Database){ + const memberRepo = new MemberRepo(database); + let userAlters : MemberModel[] = []; + await memberRepo.getAltersByUserId(userId).then( result => userAlters = result ) let userAltersNames : string[] = []; userAlters.forEach(alter => userAltersNames.push(alter.name)); @@ -14,7 +15,7 @@ export async function avatarAlterChange(userId: string, args: string[]){ userAlters.forEach( alter => { if (alter.name == args[0]) { alter.profile_pic_url = args[1]; - alterRepo.editAlter(alter) + memberRepo.editAlter(alter) } }) } diff --git a/src/commands/colorAlterChange.ts b/src/commands/colorMemberChange.ts similarity index 50% rename from src/commands/colorAlterChange.ts rename to src/commands/colorMemberChange.ts index 8b678af..c99bd41 100644 --- a/src/commands/colorAlterChange.ts +++ b/src/commands/colorMemberChange.ts @@ -1,19 +1,20 @@ -import { AlterRepo } from "../repositories/AlterRepo" -import { AlterModel } from "../models/alterModel" +import { MemberRepo } from "../repositories/MemberRepo" +import MemberModel from "../models/MemberModel" +import { Database } from "sqlite3"; -export async function colorAlterChange(userId: string, args: string[]){ - const alterRepo = new AlterRepo(); +async function colorMemberChange(userId: string, args: string[], database: Database){ + const memberRepo = new MemberRepo(database); const regexHex = /^#[0-9A-F]{6}$/i; if (args.length == 2 && regexHex.test(args[1])){ const alterName = args[0]; const alterColor = args[1]; - let alters: AlterModel[]; - await alterRepo.getAltersByUserId(userId).then( result => alters = result ) // fetching alters from user. + let alters: MemberModel[]; + await memberRepo.getAltersByUserId(userId).then( result => alters = result ) // fetching alters from user. if (alters.length == 0) return "This user has no Members." // checking if returned array is at least not 0, if len 0, then return. - let alterToEdit: AlterModel; + let alterToEdit: MemberModel; alters.forEach( alter => { if (alter.name == alterName) { alterToEdit = alter; @@ -21,10 +22,12 @@ export async function colorAlterChange(userId: string, args: string[]){ }) alterToEdit.color = alterColor; - alterRepo.editAlter(alterToEdit) + memberRepo.editAlter(alterToEdit) return "The Member's colour has been changed." } return "Error: Insufficent Arguments" } + +export default colorMemberChange diff --git a/src/commands/createAlter.ts b/src/commands/createMember.ts similarity index 72% rename from src/commands/createAlter.ts rename to src/commands/createMember.ts index ada39cb..33111d5 100644 --- a/src/commands/createAlter.ts +++ b/src/commands/createMember.ts @@ -1,18 +1,19 @@ -import { AlterRepo } from "../repositories/AlterRepo"; -import { AlterModel } from "models/alterModel" +import { Database } from "sqlite3"; +import { MemberRepo } from "../repositories/MemberRepo"; +import MemberModel from "models/MemberModel" -export async function createAlter(userId: string, args: string[]){ - const alterRepo = new AlterRepo(); +async function createMember(userId: string, args: string[], database: Database){ + const memberRepo = new MemberRepo(database); - const model: AlterModel = { + const model: MemberModel = { owner: userId, name: args[0], prefix: args[1], profile_pic_url: "https://tse3.mm.bing.net/th?id=OIP.yte7rRnbCnWi1giriwTOvwHaHa&pid=15.1" } - let userAlters: AlterModel[]; - await alterRepo.getAltersByUserId(userId).then(result => userAlters = result) + let userAlters: MemberModel[]; + await memberRepo.getAltersByUserId(userId).then(result => userAlters = result) let alterTags : string[] = []; userAlters.forEach( alter => { @@ -30,7 +31,7 @@ export async function createAlter(userId: string, args: string[]){ && args[1] != "text" && !alterNames.includes(args[0])) { - alterRepo.addAlterForUser(model); + memberRepo.addAlterForUser(model); return {message: "Member < " + model.name + " > has been succefully created", code: 0} } @@ -52,3 +53,5 @@ export async function createAlter(userId: string, args: string[]){ } } } + +export default createMember; diff --git a/src/commands/deleteAlter.ts b/src/commands/deleteAlter.ts deleted file mode 100644 index d2e99ba..0000000 --- a/src/commands/deleteAlter.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AlterRepo } from "../repositories/AlterRepo" -import { AlterModel } from "../models/alterModel" - -export async function deleteAlter(userId: string, args: string[]) { - const alterRepo = new AlterRepo(); - let success: boolean = false; - - if (args.length === 1) { - let alters: AlterModel[]; - await alterRepo.getAltersByUserId(userId).then(result => alters = result ) - alters.forEach(alter => { - if (alter.name == args[0]) { - alterRepo.deleteAlter(alter.id) - success = true; - } - }) - } - if (success) { - return "Member has been deleted" - } - else { - return "Failed to delete Member" - } -} diff --git a/src/commands/deleteMember.ts b/src/commands/deleteMember.ts new file mode 100644 index 0000000..74b5c19 --- /dev/null +++ b/src/commands/deleteMember.ts @@ -0,0 +1,25 @@ +import { MemberRepo } from "../repositories/MemberRepo" +import MemberModel from "../models/MemberModel" +import { Database } from "sqlite3"; + +export async function deleteMember(userId: string, args: string[], database: Database) { + const memberRepo = new MemberRepo(database); + let success: boolean = false; + + if (args.length === 1) { + let alters: MemberModel[]; + await memberRepo.getAltersByUserId(userId).then(result => alters = result ) + alters.forEach(alter => { + if (alter.name == args[0]) { + memberRepo.delete(alter.id) + success = true; + } + }) + } + if (success) { + return "Member has been deleted" + } + else { + return "Failed to delete Member" + } +} diff --git a/src/commands/listAlters.ts b/src/commands/listAlters.ts deleted file mode 100644 index 908e840..0000000 --- a/src/commands/listAlters.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { AlterRepo } from "../repositories/AlterRepo" -import { AlterModel } from "../models/alterModel" -import { tableConstructor } from '../utils/tableConstructor' - -export async function listAlters(userId: string) { - const alterRepo = new AlterRepo(); - let alters: AlterModel[]; - await alterRepo.getAltersByUserId(userId).then(result => { alters = result }) - - if (alters.length > 0 ) { - return tableConstructor(alters) - } - else { - return "No Members found for this user" - } -} diff --git a/src/commands/listMember.ts b/src/commands/listMember.ts new file mode 100644 index 0000000..18cf368 --- /dev/null +++ b/src/commands/listMember.ts @@ -0,0 +1,19 @@ +import { MemberRepo } from "../repositories/MemberRepo" +import { tableConstructor } from '../utils/tableConstructor' +import { Database } from "sqlite3"; +import MemberModel from "../models/MemberModel"; + +async function listMember(userId: string, database: Database) { + const memberRepo = new MemberRepo(database); + let alters: MemberModel[]; + await memberRepo.getAltersByUserId(userId).then(result => { alters = result }) + + if (alters.length > 0 ) { + return tableConstructor(alters) + } + else { + return "No Members found for this user" + } +} + +export default listMember diff --git a/src/commands/migrateAlters.ts b/src/commands/migrateMember.ts similarity index 76% rename from src/commands/migrateAlters.ts rename to src/commands/migrateMember.ts index 93a0036..a9982ce 100644 --- a/src/commands/migrateAlters.ts +++ b/src/commands/migrateMember.ts @@ -1,8 +1,9 @@ import { File } from "revolt.js" -import { createAlter } from "./createAlter" -import { avatarAlterChange } from "./avatarAlterChange" +import { Database } from "sqlite3" +import createMember from "./createMember" +import { avatarMemberChange } from "./avatarMemberChange" -export default async function migrateAlters(author: string, attachments: File[] | undefined, source: String) { +export default async function migrateAlters(author: string, attachments: File[] | undefined, source: String, database: Database) { // source is not utilized for now, it is put as an argument in case the bot evolves further let file = attachments[0] @@ -24,9 +25,9 @@ export default async function migrateAlters(author: string, attachments: File[] let name = element.name let avatar = element.avatar_url let brackets = element.brackets[0] + "text" + element.brackets[1] - const createResult = await createAlter(author, [name, brackets]) + const createResult = await createMember(author, [name, brackets], database) if ( createResult.code === 0 ) { - await avatarAlterChange(author, [name, avatar]) + await avatarMemberChange(author, [name, avatar], database) } let tupperStruct = {tupper: name, message: createResult} diff --git a/src/index.ts b/src/index.ts index 8c489fc..6aff86e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,28 +1,37 @@ import { Client, Message } from "revolt.js"; import { commandHandler } from "./utils/commandHandler" import { nonCommandHandler } from "./utils/nonCommandHandler" +import { Database } from "sqlite3"; import config from "../config.json" -const client : Client = new Client({ eagerFetching: false }); +const client : Client = new Client({ eagerFetching: false }); +const db = new Database(config.databaseName); client.on("ready", async () => { - console.info(`Gummed in as ${client.user.username}!`) - client.user.edit({status : {text: config.prefix + " help for the help menu"}}) + console.info(`logged in as ${client.user.username}!`) + client.user.edit( + { + status : { + text: config.prefix + " help for the help menu" + } + } + ) }); + client.on("messageCreate", async (message: Message) => { try{ if (!message.author) { await client.users.fetch(message.authorId) } } catch(e){console.log(e)} if (message.content === undefined) {return} - if (message.author?.bot) {} + if (message.author?.bot) {return} + + // checks if the message's body starts with the prefix + if (message.content.startsWith(config.prefix)) { + commandHandler(message, db, config.prefix); + } else { - if (message.content.startsWith(config.prefix)) { - commandHandler(message, config.prefix); - } - else { - nonCommandHandler(message); - } + nonCommandHandler(message, db); } }); diff --git a/src/models/alterModel.ts b/src/models/MemberModel.ts similarity index 68% rename from src/models/alterModel.ts rename to src/models/MemberModel.ts index 2eb4e19..412c7d4 100644 --- a/src/models/alterModel.ts +++ b/src/models/MemberModel.ts @@ -1,4 +1,4 @@ -export interface AlterModel { +interface MemberModel { id?: number; owner: string; prefix: string; @@ -6,3 +6,5 @@ export interface AlterModel { profile_pic_url: string; color?: string; } + +export default MemberModel; diff --git a/src/models/User.ts b/src/models/User.ts new file mode 100644 index 0000000..8e2d094 --- /dev/null +++ b/src/models/User.ts @@ -0,0 +1,7 @@ +interface UserModel { + id: number, + autoProxy: boolean, + autoProxyMember: number +} + +export default UserModel; diff --git a/src/repositories/AlterRepo.ts b/src/repositories/MemberRepo.ts similarity index 62% rename from src/repositories/AlterRepo.ts rename to src/repositories/MemberRepo.ts index 4084504..69da5b7 100644 --- a/src/repositories/AlterRepo.ts +++ b/src/repositories/MemberRepo.ts @@ -1,19 +1,19 @@ import { Database } from 'sqlite3'; -import { AlterModel } from '../models/alterModel' -import config from "../../config.json" +import MemberModel from '../models/MemberModel'; -export class AlterRepo { +export class MemberRepo { db : Database - constructor() { - this.db = new Database(config.databaseName); - this.db.run("CREATE TABLE IF NOT EXISTS alters (id INTEGER PRIMARY KEY AUTOINCREMENT, owner TEXT, prefix TEXT, name TEXT, profile_pic_url TEXT, color TEXT)") + + constructor(database_instance: Database) { + this.db = database_instance; + this.db.run("CREATE TABLE IF NOT EXISTS alters (id INTEGER PRIMARY KEY AUTOINCREMENT, owner TEXT, prefix TEXT, name TEXT, profile_pic_url TEXT, color TEXT)"); } - async getAltersByUserId(userId : string) : Promise { + async getAltersByUserId(userId : string) : Promise { const query : string = 'SELECT * FROM alters WHERE alters.owner = "' + userId + '"' - let result: AlterModel[] = await new Promise((resolve, reject) => { - this.db.all(query, (err, row: AlterModel[]) => { + let result: MemberModel[] = await new Promise((resolve, reject) => { + this.db.all(query, (err, row: MemberModel[]) => { if (err) { return reject(err)} else { return resolve(row) } }) @@ -22,17 +22,17 @@ export class AlterRepo { return result } - addAlterForUser(alter: AlterModel){ + addAlterForUser(alter: MemberModel){ this.db.run("INSERT INTO alters (owner, prefix, name, profile_pic_url, color) VALUES(?, ?, ?, ?, ?)", [alter.owner, alter.prefix, alter.name, alter.profile_pic_url]) } - editAlter(alter: AlterModel){ + editAlter(alter: MemberModel){ this.db.run("UPDATE alters SET owner=?, prefix=?, name=?, profile_pic_url=?, color=? WHERE alters.id ='" + alter.id + "'", [alter.owner, alter.prefix, alter.name, alter.profile_pic_url, alter.color]) } - deleteAlter(alterId: number) { + delete(alterId: number) { this.db.run("DELETE FROM alters WHERE alters.id='"+ alterId + "'") } diff --git a/src/utils/checkAutoProxy.ts b/src/utils/checkAutoProxy.ts new file mode 100644 index 0000000..213a7b9 --- /dev/null +++ b/src/utils/checkAutoProxy.ts @@ -0,0 +1,15 @@ +import { MemberRepo } from "repositories/MemberRepo"; +import { Database } from "sqlite3"; + +async function checkAutoProxy +( + userId: number, + database: Database +): Promise +{ + const repo = new MemberRepo(database) + + return true +} + +export default checkAutoProxy; diff --git a/src/utils/commandHandler.ts b/src/utils/commandHandler.ts index ed77c86..5e00cc1 100644 --- a/src/utils/commandHandler.ts +++ b/src/utils/commandHandler.ts @@ -1,15 +1,18 @@ import { Message } from "revolt.js" -import { returnHelpText } from "../commands/help" -import { listAlters } from "../commands/listAlters" -import { createAlter } from "../commands/createAlter" -import { deleteAlter } from "../commands/deleteAlter" -import { avatarAlterChange } from "../commands/avatarAlterChange" -import { colorAlterChange } from "../commands/colorAlterChange" -import migrationCommand from "../commands/migrateAlters" - +import { Database } from "sqlite3" import { split } from "shlex" -export async function commandHandler(message : Message, _prefix : String) { +import { returnHelpText } from "../commands/help" +import listMember from "../commands/listMember" +import createMember from "../commands/createMember" +import { deleteMember } from "../commands/deleteMember" +import { avatarMemberChange } from "../commands/avatarMemberChange" +import colorMemberChange from "../commands/colorMemberChange" +import migrationCommand from "../commands/migrateMember" + + + +export async function commandHandler(message : Message, db: Database, _prefix : String) { let args : string[] = split(message.content); args.shift() const command = args[0] @@ -21,28 +24,28 @@ export async function commandHandler(message : Message, _prefix : String) { break; } case "list" : { - await message.reply(await listAlters(message.author.id)); + await message.reply(await listMember(message.author.id, db)); break; } case "create" : { - const commandResponse = await createAlter(message.author.id, args); + const commandResponse = await createMember(message.author.id, args, db); await message.reply (commandResponse.message) break } case "delete" : { - await message.reply(await deleteAlter(message.author.id, args)) + await message.reply(await deleteMember(message.author.id, args, db)) break } case "avatar" : { - await message.reply(await avatarAlterChange(message.author.id, args)); + await message.reply(await avatarMemberChange(message.author.id, args, db)); break } case "color" : { - await message.reply(await colorAlterChange(message.author.id, args)); + await message.reply(await colorMemberChange(message.author.id, args, db)); break } case "tupper" : { - await message.reply(await migrationCommand(message.author.id, message.attachments, "placeholder")) + await message.reply(await migrationCommand(message.author.id, message.attachments, "placeholder", db)) break } } diff --git a/src/utils/nonCommandHandler.ts b/src/utils/nonCommandHandler.ts index 43838fa..e606b1b 100644 --- a/src/utils/nonCommandHandler.ts +++ b/src/utils/nonCommandHandler.ts @@ -1,46 +1,7 @@ import { Message } from "revolt.js" -import { AlterRepo } from "../repositories/AlterRepo" -import { AlterModel } from "../models/alterModel" +import { Database } from "sqlite3"; +import sendAsMember from "./sendAsMemberHandler"; -export async function nonCommandHandler(message : Message){ - const alterRepo: AlterRepo = new AlterRepo(); - let alters: AlterModel[]; - await alterRepo.getAltersByUserId(message.author.id).then(result => alters = result); - - alters.forEach( async alter => { - const pre_prefix = alter.prefix.split("text"); - if (message.content.startsWith(pre_prefix[0]) && message.content.endsWith(pre_prefix[1])) { - let actualContent: string = message.content; - actualContent = actualContent.slice(pre_prefix[0].length, actualContent.length - pre_prefix[1].length) - - const replyIds: string[] | undefined = message.replyIds; - let replies: any[] = []; - - if (replyIds !== undefined) { - replyIds.forEach( replyId => { - replies.push({ - id: replyId, - mention: false - }) - }) - } - - try{ - await message.channel.sendMessage({ - content: actualContent, - masquerade: { - name: alter.name , - avatar: alter.profile_pic_url, - color: alter.color - }, - replies: replies - }) - await message.delete(); - } - catch(e){ - console.log(e) - await message.channel.sendMessage("Error: PluralCake requires at least these permissions: \n- Masquerade permissions. \n- Message editing permissions.") - } - } - }) +export async function nonCommandHandler(message : Message, database: Database){ + await sendAsMember(message, database); } diff --git a/src/utils/sendAsMemberHandler.ts b/src/utils/sendAsMemberHandler.ts new file mode 100644 index 0000000..75d87be --- /dev/null +++ b/src/utils/sendAsMemberHandler.ts @@ -0,0 +1,47 @@ +import { Message } from "revolt.js" +import { Database } from "sqlite3"; +import { MemberRepo } from "../repositories/MemberRepo" +import MemberModel from "../models/MemberModel" + +export default async function sendAsMember(message: Message, database: Database) { + const alterRepo: MemberRepo = new MemberRepo(database); + let alters: MemberModel[]; + await alterRepo.getAltersByUserId(message.author.id).then(result => alters = result); + + alters.forEach( async alter => { + const pre_prefix = alter.prefix.split("text"); + if (message.content.startsWith(pre_prefix[0]) && message.content.endsWith(pre_prefix[1])) { + let actualContent: string = message.content; + actualContent = actualContent.slice(pre_prefix[0].length, actualContent.length - pre_prefix[1].length) + + const replyIds: string[] | undefined = message.replyIds; + let replies: any[] = []; + + if (replyIds !== undefined) { + replyIds.forEach( replyId => { + replies.push({ + id: replyId, + mention: false + }) + }) + } + + try{ + await message.channel.sendMessage({ + content: actualContent, + masquerade: { + name: alter.name , + avatar: alter.profile_pic_url, + color: alter.color + }, + replies: replies + }) + await message.delete(); + } + catch(e){ + console.log(e) + await message.channel.sendMessage("Error: PluralCake requires at least these permissions: \n- Masquerade permissions. \n- Message editing permissions.") + } + } + }) +}