cordis/client/webapp/guild-ram.ts
Michael Peters f00127f486 fixes
2021-12-03 18:47:33 -06:00

155 lines
5.2 KiB
TypeScript

import * as electronRemote from '@electron/remote';
const electronConsole = electronRemote.getGlobal('console') as Console;
import Logger from '../../logger/logger';
const LOG = Logger.create(__filename, electronConsole);
import { SyncFetchable, SyncLackable } from "./guild-types";
import { GuildMetadata, Member, Channel, Message, Resource, Token } from "./data-types";
import MessageRAMCache from "./message-ram-cache";
import ResourceRAMCache from "./resource-ram-cache";
export default class RAMGuild implements SyncFetchable, SyncLackable {
private metadata: GuildMetadata | null = null;
private members = new Map<string, Member>(); // id -> member
private channels = new Map<string, Channel>(); // id -> channel
constructor(
private readonly recentMessages: MessageRAMCache,
private readonly resources: ResourceRAMCache,
private readonly guildId: number
) {}
getMembers(): Map<string, Member> {
return this.members;
}
getChannels(): Map<string, Channel> {
return this.channels;
}
fetchMetadata(): GuildMetadata | null {
return this.metadata;
}
fetchMembers(): Member[] | null {
return this.members.size === 0 ? null : Array.from(this.members.values());
}
fetchChannels(): Channel[] | null {
return this.channels.size === 0 ? null : Array.from(this.channels.values());
}
fetchMessagesRecent(channelId: string, number: number): Message[] | null {
return this.recentMessages.fetchRecentMessages(this.guildId, channelId, number);
}
fetchMessagesBefore(channelId: string, messageId: string, number: number): Message[] | null {
return null; // not planning on doing this unless someone wants to do a scrolling cache
}
fetchMessagesAfter(channelId: string, messageId: string, number: number): Message[] | null {
return null; // not planning on doing this unless someone wants to do a scrolling cache
}
fetchResource(resourceId: string): Resource | null {
return this.resources.getResource(this.guildId, resourceId);
}
fetchTokens(): Token[] | null {
return null; // TODO: token ram cache
}
handleMetadataChanged(changedMetaData: GuildMetadata): void {
this.metadata = changedMetaData;
}
handleMembersAdded(addedMembers: Member[]): void {
// LOG.debug('RAM members added', { addedMembers });
for (let member of addedMembers) {
this.members.set(member.id, member);
}
}
handleMembersChanged(changedMembers: Member[]): void {
// LOG.debug('RAM members changed', { changedMembers });
for (let member of changedMembers) {
if (this.members.has(member.id)) this.members.set(member.id, member);
}
}
handleMembersDeleted(deletedMembers: Member[]): void {
// LOG.debug('RAM members deleted', { deletedMembers });
for (let member of deletedMembers) {
this.members.delete(member.id);
}
}
handleChannelsAdded(addedChannels: Channel[]): void {
for (let channel of addedChannels) {
this.channels.set(channel.id, channel);
}
}
handleChannelsChanged(changedChannels: Channel[]): void {
for (let channel of changedChannels) {
if (this.channels.has(channel.id)) this.channels.set(channel.id, channel);
}
}
handleChannelsDeleted(deletedChannels: Channel[]): void {
for (let channel of deletedChannels) {
this.channels.delete(channel.id);
}
}
handleMessagesAdded(addedMessages: Message[]): void {
let byChannel = new Map<string, Message[]>();
for (let message of addedMessages) {
if (!byChannel.has(message.channel.id)) {
byChannel.set(message.channel.id, [ message ]);
} else {
byChannel.get(message.channel.id)?.push(message);
}
}
for (let [ channelId, messages ] of byChannel.entries()) {
this.recentMessages.upsertMessages(this.guildId, channelId, messages);
}
}
handleMessagesChanged(changedMessages: Message[]): void {
let byChannel = new Map<string, Message[]>();
for (let message of changedMessages) {
if (!byChannel.has(message.channel.id)) {
byChannel.set(message.channel.id, [ message ]);
} else {
byChannel.get(message.channel.id)?.push(message);
}
}
for (let [ channelId, messages ] of byChannel.entries()) {
this.recentMessages.upsertMessages(this.guildId, channelId, messages);
}
}
handleMessagesDeleted(deletedMessages: Message[]): void {
let byChannel = new Map<string, Message[]>();
for (let message of deletedMessages) {
if (!byChannel.has(message.channel.id)) {
byChannel.set(message.channel.id, [ message ]);
} else {
byChannel.get(message.channel.id)?.push(message);
}
}
for (let [ channelId, messages ] of byChannel.entries()) {
this.recentMessages.deleteMessages(this.guildId, channelId, messages);
}
}
handleResourceAdded(addedResource: Resource): void {
this.resources.putResource(this.guildId, addedResource);
}
handleResourceChanged(changedResource: Resource): void {
// This should be rare/never happen
this.resources.putResource(this.guildId, changedResource);
}
handleResourceDeleted(deletedResource: Resource): void {
// do nothing, the cache will garbage collect itself :)
// also resource deletion should be pretty rare, especially in a cache
return;
}
handleTokensAdded(addedTokens: Token[]): void {
return; // TODO: token ram cache
}
handleTokensChanged(changedTokens: Token[]): void {
return; // TODO: token ram cache
}
handleTokensDeleted(deletedTokens: Token[]): void {
return; // TODO: token ram cache
}
}