mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-05-10 20:35:02 +00:00
Add MessageSaver plugin. Fix some buggy queries.
This commit is contained in:
parent
50fb696d62
commit
ba2ad8a528
8 changed files with 275 additions and 5 deletions
|
@ -21,7 +21,8 @@ export class GuildArchives extends BaseRepository {
|
|||
private deleteExpiredArchives() {
|
||||
this.archives
|
||||
.createQueryBuilder()
|
||||
.where("expires_at <= NOW()")
|
||||
.where("guild_id = :guild_id", { guild_id: this.guildId })
|
||||
.andWhere("expires_at <= NOW()")
|
||||
.delete()
|
||||
.execute();
|
||||
}
|
||||
|
|
|
@ -15,8 +15,8 @@ export class GuildMutes extends BaseRepository {
|
|||
return this.mutes
|
||||
.createQueryBuilder("mutes")
|
||||
.where("guild_id = :guild_id", { guild_id: this.guildId })
|
||||
.where("expires_at IS NOT NULL")
|
||||
.where("expires_at <= NOW()")
|
||||
.andWhere("expires_at IS NOT NULL")
|
||||
.andWhere("expires_at <= NOW()")
|
||||
.getMany();
|
||||
}
|
||||
|
||||
|
|
98
src/data/GuildSavedMessages.ts
Normal file
98
src/data/GuildSavedMessages.ts
Normal file
|
@ -0,0 +1,98 @@
|
|||
import { Brackets, getRepository, Repository } from "typeorm";
|
||||
import { BaseRepository } from "./BaseRepository";
|
||||
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage";
|
||||
import EventEmitter from "events";
|
||||
|
||||
const CLEANUP_INTERVAL = 5 * 60 * 1000;
|
||||
|
||||
const RETENTION_PERIOD = 7 * 24 * 60 * 60 * 1000; // 1 week
|
||||
|
||||
export class GuildSavedMessages extends BaseRepository {
|
||||
private messages: Repository<SavedMessage>;
|
||||
public events: EventEmitter;
|
||||
|
||||
constructor(guildId) {
|
||||
super(guildId);
|
||||
this.messages = getRepository(SavedMessage);
|
||||
this.events = new EventEmitter();
|
||||
|
||||
this.cleanup();
|
||||
setInterval(() => this.cleanup(), CLEANUP_INTERVAL);
|
||||
}
|
||||
|
||||
async cleanup() {
|
||||
await this.messages
|
||||
.createQueryBuilder("messages")
|
||||
.where("guild_id = :guild_id", { guild_id: this.guildId })
|
||||
.andWhere(
|
||||
new Brackets(qb => {
|
||||
// Clear deleted messages
|
||||
qb.orWhere(
|
||||
new Brackets(qb2 => {
|
||||
qb2.where("deleted_at IS NOT NULL");
|
||||
qb2.andWhere(`deleted_at <= (NOW() - INTERVAL ${CLEANUP_INTERVAL}000 MICROSECOND)`);
|
||||
})
|
||||
);
|
||||
|
||||
// Clear old messages
|
||||
qb.orWhere(
|
||||
new Brackets(qb2 => {
|
||||
qb2.where("is_permanent = 0");
|
||||
qb2.andWhere(`posted_at <= (NOW() - INTERVAL ${RETENTION_PERIOD}000 MICROSECOND)`);
|
||||
})
|
||||
);
|
||||
})
|
||||
)
|
||||
.delete()
|
||||
.execute();
|
||||
}
|
||||
|
||||
find(id) {
|
||||
return this.messages.findOne({
|
||||
where: {
|
||||
guild_id: this.guildId,
|
||||
id
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async create(data) {
|
||||
try {
|
||||
await this.messages.insert({ ...data, guild_id: this.guildId });
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
const inserted = await this.messages.findOne(data.id);
|
||||
this.events.emit("create", [inserted]);
|
||||
}
|
||||
|
||||
async markAsDeleted(id) {
|
||||
await this.messages
|
||||
.createQueryBuilder("messages")
|
||||
.update()
|
||||
.set({
|
||||
deleted_at: () => "NOW(3)"
|
||||
})
|
||||
.where("guild_id = :guild_id", { guild_id: this.guildId })
|
||||
.andWhere("id = :id", { id })
|
||||
.execute();
|
||||
|
||||
const deleted = await this.messages.findOne(id);
|
||||
this.events.emit("delete", [deleted]);
|
||||
}
|
||||
|
||||
async edit(id, newData: ISavedMessageData) {
|
||||
const oldMessage = await this.messages.findOne(id);
|
||||
const newMessage = { ...oldMessage, data: newData };
|
||||
|
||||
await this.messages.update(
|
||||
{ id },
|
||||
{
|
||||
data: newData
|
||||
}
|
||||
);
|
||||
|
||||
this.events.emit("edit", [newMessage, oldMessage]);
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@ export class GuildTags extends BaseRepository {
|
|||
created_at: () => "NOW()"
|
||||
})
|
||||
.where("guild_id = :guildId", { guildId: this.guildId })
|
||||
.where("tag = :tag", { tag })
|
||||
.andWhere("tag = :tag", { tag })
|
||||
.execute();
|
||||
} else {
|
||||
await this.tags.insert({
|
||||
|
|
33
src/data/entities/SavedMessage.ts
Normal file
33
src/data/entities/SavedMessage.ts
Normal file
|
@ -0,0 +1,33 @@
|
|||
import { Entity, Column, PrimaryColumn } from "typeorm";
|
||||
import { Message } from "eris";
|
||||
|
||||
export interface ISavedMessageData {
|
||||
attachments: object[];
|
||||
author: {
|
||||
username: string;
|
||||
discriminator: string;
|
||||
};
|
||||
content: string;
|
||||
embeds: object[];
|
||||
}
|
||||
|
||||
@Entity("messages")
|
||||
export class SavedMessage {
|
||||
@Column()
|
||||
@PrimaryColumn()
|
||||
id: string;
|
||||
|
||||
@Column() guild_id: string;
|
||||
|
||||
@Column() channel_id: string;
|
||||
|
||||
@Column() user_id: string;
|
||||
|
||||
@Column() is_bot: boolean;
|
||||
|
||||
@Column("simple-json") data: ISavedMessageData;
|
||||
|
||||
@Column() posted_at: string;
|
||||
|
||||
@Column() deleted_at: string;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue