diff --git a/src/bot.ts b/src/bot.ts index 3422880637d950d6ab4e19a1803de1a8561b7f00..6a160ce6da2aa760f384b4b9c9a63ee0c8dd8805 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -208,11 +208,13 @@ export class DiscordBot { if (!Array.isArray(msg)) { msg = [msg]; } - msg.forEach((m) => { + msg.forEach((m: Discord.Message) => { this.sentMessages.push(m.id); const evt = new DbEvent(); evt.MatrixId = event.event_id; evt.DiscordId = m.id; + evt.GuildId = m.guild.id; + evt.ChannelId = m.channel.id; this.store.Insert(evt); }); return; @@ -539,6 +541,8 @@ export class DiscordBot { const evt = new DbEvent(); evt.MatrixId = res.event_id; evt.DiscordId = msg.id; + evt.ChannelId = msg.channel.id; + evt.GuildId = msg.guild.id; this.store.Insert(evt); }); }); diff --git a/src/db/dbdataevent.ts b/src/db/dbdataevent.ts index 3b7e92e7eb99f1ac9608f413af5aafcf72c158e8..f89ef6872150de7632b4b5f4755f834788ea4190 100644 --- a/src/db/dbdataevent.ts +++ b/src/db/dbdataevent.ts @@ -5,57 +5,85 @@ import * as log from "npmlog"; export class DbEvent implements IDbData { public MatrixId: string; public DiscordId: string; + public GuildId: string; + public ChannelId: string; public Result: boolean; public async RunQuery(store: DiscordStore, params: any): Promise<null> { log.silly("DiscordStore", "_get_schema_version"); - let row = null; + let rowM = null; if (params.matrix_id) { - row = await store.db.getAsync(` + rowM = await store.db.getAsync(` SELECT * FROM event_store WHERE matrix_id = $id`, { $id: params.matrix_id, }); } else if (params.discord_id) { - row = await store.db.getAsync(` + rowM = await store.db.getAsync(` SELECT * FROM event_store WHERE discord_id = $id`, { $id: params.discord_id, }); } else { - throw new Error("Unknown row given as a param"); + throw new Error("Unknown/incorrect id given as a param"); } - this.Result = row !== undefined; + this.Result = rowM !== undefined; if (this.Result) { - this.MatrixId = row.matrix_id; - this.DiscordId = row.discord_id; + this.MatrixId = rowM.matrix_id; + this.DiscordId = rowM.discord_id; + const rowD = await store.db.getAsync(` + SELECT * + FROM discord_msg_store + WHERE msg_id = $id`, { + $id: rowM.discord_id, + }); + if (rowD !== undefined) { + this.GuildId = rowD.guild_id; + this.ChannelId = rowD.guild_id; + } else { + this.Result = false; + throw new Error("Could not find discord event data in discord_msg_store"); + } } return null; } - public Insert(store: DiscordStore): Promise<null> { - return store.db.runAsync(` + public async Insert(store: DiscordStore): Promise<null> { + await store.db.runAsync(` INSERT INTO event_store (matrix_id,discord_id) VALUES ($matrix_id,$discord_id);`, { $matrix_id: this.MatrixId, $discord_id: this.DiscordId, }); + return store.db.runAsync(` + INSERT INTO discord_msg_store + (msg_id, guild_id, channel_id) + VALUES ($msg_id, $guild_id, $channel_id);`, { + $msg_id: this.DiscordId, + $guild_id: this.GuildId, + $channel_id: this.ChannelId, + }); } public Update(store: DiscordStore): Promise<null> { throw new Error("Update is not implemented"); } - public Delete(store: DiscordStore): Promise<null> { - return store.db.runAsync(` + public async Delete(store: DiscordStore): Promise<null> { + await store.db.runAsync(` DELETE FROM event_store WHERE matrix_id = $matrix_id AND discord_id = $discord_id;`, { $matrix_id: this.MatrixId, $discord_id: this.DiscordId, }); + return store.db.runAsync(` + DELETE FROM discord_msg_store + WHERE msg_id = $discord_id;`, { + $discord_id: this.DiscordId, + }); } } diff --git a/src/db/dbdatainterface.ts b/src/db/dbdatainterface.ts index 5f16794336797558883dd18d98665a1e976de65b..74ab8d7afdc0c56ae4105adb2823276d0985607d 100644 --- a/src/db/dbdatainterface.ts +++ b/src/db/dbdatainterface.ts @@ -2,8 +2,8 @@ import { DiscordStore } from "../store"; export interface IDbData { Result: boolean; - RunQuery(store: DiscordStore, params: any): Promise<null>; - Insert(store: DiscordStore): Promise<null>; - Update(store: DiscordStore): Promise<null>; - Delete(store: DiscordStore): Promise<null>; + RunQuery(store: DiscordStore, params: any): Promise<null|Error>; + Insert(store: DiscordStore): Promise<null|Error>; + Update(store: DiscordStore): Promise<null|Error>; + Delete(store: DiscordStore): Promise<null|Error>; } diff --git a/src/db/schema/v5.ts b/src/db/schema/v5.ts index 433eb996c5d1f890661e737045a356423fda5dbc..8d6320dd3413d1772b6268463db24951ec4f176b 100644 --- a/src/db/schema/v5.ts +++ b/src/db/schema/v5.ts @@ -17,7 +17,7 @@ export class Schema implements IDbSchema { public rollBack(store: DiscordStore): Promise <null> { return store.db.execAsync( - `DROP TABLE IF EXISTS guild_emoji;`, + `DROP TABLE IF EXISTS event_store;`, ); } } diff --git a/src/db/schema/v6.ts b/src/db/schema/v6.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1c5882cc06ec290de3e547aeb0024e95005bc9a --- /dev/null +++ b/src/db/schema/v6.ts @@ -0,0 +1,34 @@ +import {IDbSchema} from "./dbschema"; +import {DiscordStore} from "../../store"; +import {DiscordClientFactory} from "../../clientfactory"; +import * as log from "npmlog"; +import * as Bluebird from "bluebird"; + +export class Schema implements IDbSchema { + public description = "create event_store and discord_msg_store tables"; + public async run(store: DiscordStore): Promise<Error> { + await store.db.execAsync( + `DROP TABLE IF EXISTS event_store;`, + ); + await store.create_table(` + CREATE TABLE event_store ( + matrix_id TEXT NOT NULL, + discord_id TEXT NOT NULL, + PRIMARY KEY(matrix_id, discord_id) + );`, "event_store"); + return await store.create_table(` + CREATE TABLE discord_msg_store ( + msg_id TEXT NOT NULL, + guild_id TEXT NOT NULL, + channel_id TEXT NOT NULL, + PRIMARY KEY(msg_id) + );`, "discord_msg_store"); + } + + public rollBack(store: DiscordStore): Promise <null> { + return store.db.execAsync( + `DROP TABLE IF EXISTS event_store;`, + `DROP TABLE IF EXISTS discord_msg_store;`, + ); + } +} diff --git a/src/store.ts b/src/store.ts index a003de5eabb45cd4fb08bac577952212b02e7d19..2ea8267beac650e17d78bf1f8a25e3a71677449b 100644 --- a/src/store.ts +++ b/src/store.ts @@ -4,7 +4,7 @@ import * as Bluebird from "bluebird"; import * as fs from "fs"; import { IDbSchema } from "./db/schema/dbschema"; import { IDbData} from "./db/dbdatainterface"; -const CURRENT_SCHEMA = 5; +const CURRENT_SCHEMA = 6; /** * Stores data for specific users and data not specific to rooms. */ @@ -22,7 +22,7 @@ export class DiscordStore { public backup_database(): Promise<null> { if (this.filepath === ":memory:") { - log.warn("DiscordStore", "Can't backup a :memory: database."); + log.info("DiscordStore", "Can't backup a :memory: database."); return Promise.resolve(); } const BACKUP_NAME = this.filepath + ".backup"; diff --git a/test/test_store.ts b/test/test_store.ts index 0b3c3f7a0389dd29bb9a705c0573e66ed0dd657c..46287b08cf44a79091a4aacc1ec17beaf68dbe5b 100644 --- a/test/test_store.ts +++ b/test/test_store.ts @@ -10,7 +10,7 @@ Chai.use(ChaiAsPromised); const expect = Chai.expect; log.level = "warn"; -const TEST_SCHEMA = 5; +const TEST_SCHEMA = 6; // const assert = Chai.assert; @@ -18,14 +18,8 @@ describe("DiscordStore", () => { describe("init", () => { it("can create a db", () => { const store = new DiscordStore(":memory:"); - return store.init(-1); + return store.init(); }); - for (let i = 1; i < TEST_SCHEMA; i++) { - it("update schema to v" + i, () => { - const store = new DiscordStore(":memory:"); - return store.init(i); - }); - } }); describe("add_user_token", () => { it("should not throw when adding an entry", () => { @@ -93,6 +87,8 @@ describe("DiscordStore", () => { const event = new DbEvent(); event.MatrixId = "123"; event.DiscordId = "456"; + event.GuildId = "123"; + event.ChannelId = "123"; return store.Insert(event); })).to.eventually.be.fulfilled; }); @@ -102,19 +98,25 @@ describe("DiscordStore", () => { const event = new DbEvent(); event.MatrixId = "123"; event.DiscordId = "456"; + event.GuildId = "123"; + event.ChannelId = "123"; await store.Insert(event); const getEventDiscord = await store.Get(DbEvent, {discord_id: "456"}); Chai.assert.equal(getEventDiscord.MatrixId, "123"); Chai.assert.equal(getEventDiscord.DiscordId, "456"); + Chai.assert.equal(getEventDiscord.GuildId, "123"); + Chai.assert.equal(getEventDiscord.ChannelId, "123"); const getEventMatrix = await store.Get(DbEvent, {matrix_id: "123"}); - Chai.assert.equal(getEventDiscord.MatrixId, "123"); - Chai.assert.equal(getEventDiscord.DiscordId, "456"); + Chai.assert.equal(getEventMatrix.MatrixId, "123"); + Chai.assert.equal(getEventMatrix.DiscordId, "456"); + Chai.assert.equal(getEventMatrix.GuildId, "123"); + Chai.assert.equal(getEventMatrix.ChannelId, "123"); }); - it("should not return nonexistant emoji", async () => { + it("should not return nonexistant event", async () => { const store = new DiscordStore(":memory:"); await store.init(); - const getEmoji = await store.Get(DbEvent, {matrix_id: "123"}); - Chai.assert.isFalse(getEmoji.Result); + const getMessage = await store.Get(DbEvent, {matrix_id: "123"}); + Chai.assert.isFalse(getMessage.Result); }); it("should delete successfully", async () => { const store = new DiscordStore(":memory:"); @@ -122,6 +124,8 @@ describe("DiscordStore", () => { const event = new DbEvent(); event.MatrixId = "123"; event.DiscordId = "456"; + event.GuildId = "123"; + event.ChannelId = "123"; await store.Insert(event); await store.Delete(event); const getEvent = await store.Get(DbEvent, {matrix_id: "123"});