aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/relationshipNotifier/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/relationshipNotifier/utils.ts')
-rw-r--r--src/plugins/relationshipNotifier/utils.ts149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/plugins/relationshipNotifier/utils.ts b/src/plugins/relationshipNotifier/utils.ts
new file mode 100644
index 0000000..09a329a
--- /dev/null
+++ b/src/plugins/relationshipNotifier/utils.ts
@@ -0,0 +1,149 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2023 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+import { DataStore, Notices } from "@api/index";
+import { showNotification } from "@api/Notifications";
+import { ChannelStore, GuildStore, RelationshipStore, UserUtils } from "@webpack/common";
+
+import settings from "./settings";
+import { ChannelType, RelationshipType, SimpleGroupChannel, SimpleGuild } from "./types";
+
+const guilds = new Map<string, SimpleGuild>();
+const groups = new Map<string, SimpleGroupChannel>();
+const friends = {
+ friends: [] as string[],
+ requests: [] as string[]
+};
+
+export async function syncAndRunChecks() {
+ const [oldGuilds, oldGroups, oldFriends] = await DataStore.getMany([
+ "relationship-notifier-guilds",
+ "relationship-notifier-groups",
+ "relationship-notifier-friends"
+ ]) as [Map<string, SimpleGuild> | undefined, Map<string, SimpleGroupChannel> | undefined, Record<"friends" | "requests", string[]> | undefined];
+
+ await Promise.all([syncGuilds(), syncGroups(), syncFriends()]);
+
+ if (settings.store.offlineRemovals) {
+ if (settings.store.groups && oldGroups?.size) {
+ for (const [id, group] of oldGroups) {
+ if (!groups.has(id))
+ notify(`You are no longer in the group ${group.name}.`, group.iconURL);
+ }
+ }
+
+ if (settings.store.servers && oldGuilds?.size) {
+ for (const [id, guild] of oldGuilds) {
+ if (!guilds.has(id))
+ notify(`You are no longer in the server ${guild.name}.`, guild.iconURL);
+ }
+ }
+
+ if (settings.store.friends && oldFriends?.friends.length) {
+ for (const id of oldFriends.friends) {
+ if (friends.friends.includes(id)) continue;
+
+ const user = await UserUtils.fetchUser(id).catch(() => void 0);
+ if (user)
+ notify(`You are no longer friends with ${user.tag}.`, user.getAvatarURL(undefined, undefined, false));
+ }
+ }
+
+ if (settings.store.friendRequestCancels && oldFriends?.requests?.length) {
+ for (const id of oldFriends.requests) {
+ if (friends.requests.includes(id)) continue;
+
+ const user = await UserUtils.fetchUser(id).catch(() => void 0);
+ if (user)
+ notify(`Friend request from ${user.tag} has been revoked.`, user.getAvatarURL(undefined, undefined, false));
+ }
+ }
+ }
+}
+
+export function notify(text: string, icon?: string) {
+ if (settings.store.notices)
+ Notices.showNotice(text, "OK", () => Notices.popNotice());
+
+ showNotification({
+ title: "Relationship Notifier",
+ body: text,
+ icon
+ });
+}
+
+export function getGuild(id: string) {
+ return guilds.get(id);
+}
+
+export function deleteGuild(id: string) {
+ guilds.delete(id);
+ syncGuilds();
+}
+
+export async function syncGuilds() {
+ for (const [id, { name, icon }] of Object.entries(GuildStore.getGuilds())) {
+ guilds.set(id, {
+ id,
+ name,
+ iconURL: icon && `https://cdn.discordapp.com/icons/${id}/${icon}.png`
+ });
+ }
+ await DataStore.set("relationship-notifier-guilds", guilds);
+}
+
+export function getGroup(id: string) {
+ return groups.get(id);
+}
+
+export function deleteGroup(id: string) {
+ groups.delete(id);
+ syncGroups();
+}
+
+export async function syncGroups() {
+ for (const { type, id, name, rawRecipients, icon } of ChannelStore.getSortedPrivateChannels()) {
+ if (type === ChannelType.GROUP_DM)
+ groups.set(id, {
+ id,
+ name: name || rawRecipients.map(r => r.username).join(", "),
+ iconURL: icon && `https://cdn.discordapp.com/channel-icons/${id}/${icon}.png`
+ });
+ }
+
+ await DataStore.set("relationship-notifier-groups", groups);
+}
+
+export async function syncFriends() {
+ friends.friends = [];
+ friends.requests = [];
+
+ const relationShips = RelationshipStore.getRelationships();
+ for (const id in relationShips) {
+ switch (relationShips[id]) {
+ case RelationshipType.FRIEND:
+ friends.friends.push(id);
+ break;
+ case RelationshipType.FRIEND_REQUEST:
+ friends.requests.push(id);
+ break;
+ }
+ }
+
+ await DataStore.set("relationship-notifier-friends", friends);
+}