diff --git a/src/commands/fun/meme.ts b/src/commands/fun/meme.ts deleted file mode 100644 index e7334be..0000000 --- a/src/commands/fun/meme.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Message } from "eris"; -import { client } from "../../client/Client"; -import { MovCommand } from "../../client/Command"; -import { pick } from "../../utils/math"; -import { getSubreddit, parseToEmbed } from "../../utils/reddit"; - -async function generator(msg: Message, _args: string[]) { - const subreddits = [ - "memes", - "dankmemes", - "meme", - "okbuddyretard", - "ComedyArchaeology", - ]; - const pickedSubreddit = pick(subreddits); - try { - const r = await getSubreddit(pickedSubreddit, { - mediaOnly: true, - }); - - const pickedContent = pick(r); - client.createMessage( - msg.channel.id, - parseToEmbed(pickedContent).build(), - ); - } catch (e) { - client.createMessage(msg.channel.id, `${e}`); - } -} - -class Meme extends MovCommand { - constructor() { - super("meme", generator, { - aliases: ["memes", "funny"], - }); - } -} - -export default new Meme(); diff --git a/src/commands/fun/reddit.ts b/src/commands/fun/reddit.ts deleted file mode 100644 index ff56115..0000000 --- a/src/commands/fun/reddit.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { - AutocompleteInteraction, - CommandInteraction, - ComponentInteraction, - Message, - PingInteraction, - UnknownInteraction, -} from "eris"; -import { client } from "../../client/Client"; -import { MovCommand } from "../../client/Command"; -import { Data2 } from "../../interfaces/reddit"; -import { makeid } from "../../utils/makeid"; -import { getSubreddit, parseToEmbed } from "../../utils/reddit"; - -async function generator(msg: Message, args: string[]) { - if (!args[0]) { - client.createMessage(msg.channel.id, "Please input specific subreddit"); - return; - } - let page = 0; - let contents: Data2[] | null = null; - try { - contents = await getSubreddit(args.join("_").replace(/^r\//, ""), { - includeStickied: false, - limit: 20, - noNSFW: "nsfw" in msg.channel ? !msg.channel.nsfw : true, - }); - } catch (e) { - client.createMessage(msg.channel.id, `${e}`); - return; - } - if (!contents) return; - if (contents.length < 1) { - client.createMessage( - msg.channel.id, - "Empty content? You either look for empty subreddit or the subreddit is full of nsfw", - ); - return; - } - - const id = makeid(4); - const orgMsg = await client.createMessage(msg.channel.id, { - ...parseToEmbed(contents[page]) - .setAuthor(`Page ${page + 1}/${contents.length}`) - .build(), - components: [ - { - type: 1, - components: [ - { - custom_id: `back_${id}`, - type: 2, - style: 2, - emoji: { - name: "⬅️", - }, - }, - { - custom_id: `forward_${id}`, - type: 2, - style: 2, - emoji: { - name: "➡️", - }, - }, - { - custom_id: `stop_${id}`, - type: 2, - style: 4, - emoji: { - name: "🛑", - }, - }, - ], - }, - ], - }); - - if (client.listenerCount("interactionCreate") > 0) { - client.removeAllListeners("interactionCreate"); - } - async function interactionCreate( - i: - | PingInteraction - | CommandInteraction - | ComponentInteraction - | AutocompleteInteraction - | UnknownInteraction, - ) { - if (!contents) return; - if (i.type === 3) { - if (!i.acknowledged) { - await i.acknowledge({ type: 7 }); - } - switch ((i.data! as any).custom_id) { - case `back_${id}`: - if (page <= 0) { - page = 0; - } else { - page--; - } - await i.editMessage(orgMsg.id, { - ...parseToEmbed(contents[page]) - .setAuthor(`Page ${page + 1}/${contents.length}`) - .build(), - }); - break; - case `forward_${id}`: - if (page >= contents.length - 1) { - page = contents.length - 1; - } else { - page++; - } - await i.editMessage(orgMsg.id, { - ...parseToEmbed(contents[page]) - .setAuthor(`Page ${page + 1}/${contents.length}`) - .build(), - }); - break; - case `stop_${id}`: - await i.editMessage(orgMsg.id, { components: [] }); - client.removeListener( - "interactionCreate", - interactionCreate, - ); - break; - } - } - } - client.on("interactionCreate", interactionCreate); -} - -class Reddit extends MovCommand { - constructor() { - super("reddit", generator, { - aliases: ["r"], - cooldown: 30 * 1000, - }); - } -} - -export default new Reddit(); diff --git a/src/commands/settings/example.ts b/src/commands/settings/example.ts index e01ad02..a200556 100644 --- a/src/commands/settings/example.ts +++ b/src/commands/settings/example.ts @@ -31,9 +31,6 @@ add instances {"name": "New instance", "url": ["https://url.to.rss"], "channelId set customMsg New news just dropped! {link}`, bump: ` set roleID 1234567890123`, - autopost: ` -add instances {"name": "memes", "channelId": "12345678901234", "subreddits": ["memes", "dankmemes"]} -set instances [{"name": "memes", "channelId": "12345678901234", "subreddits": ["memes", "dankmemes"]}]`, autopublish: "", messageReference: "", clock: "", @@ -62,7 +59,6 @@ export const VARIABLES: base = { \`{url}\` - Link to RSS article `, bump: "", - autopost: "", autopublish: "", messageReference: "", clock: "", diff --git a/src/constant/defaultConfig.ts b/src/constant/defaultConfig.ts index 4e3840b..199a8e7 100644 --- a/src/constant/defaultConfig.ts +++ b/src/constant/defaultConfig.ts @@ -9,16 +9,6 @@ export const DEFAULT_SERVER_SETTINGS: ISettingsDB = { channelId: "1234567897654321", timezone: "Europe/London", }, - autopost: { - enable: false, - instances: [ - { - name: "lol", - channelId: "12345678234567", - subreddits: ["memes", "dankmemes"], - }, - ], - }, welcome: { enable: false, channelId: "channel ID", diff --git a/src/interfaces/module.ts b/src/interfaces/module.ts index 6c90773..6c9cfdb 100644 --- a/src/interfaces/module.ts +++ b/src/interfaces/module.ts @@ -1,12 +1,4 @@ export interface Modules { - autopost: Partial<{ - enable: boolean; - instances: { - name: string; - channelId: string; - subreddits: string[]; - }[]; - }>; welcome: Partial<{ enable: boolean; channelId: string; diff --git a/src/interfaces/reddit.ts b/src/interfaces/reddit.ts deleted file mode 100644 index 63511d1..0000000 --- a/src/interfaces/reddit.ts +++ /dev/null @@ -1,339 +0,0 @@ -export interface Root { - kind: string; - data: Data; -} - -export interface Data { - after: string; - dist: number; - modhash: string; - geo_filter: any; - children: Children[]; - before: any; -} - -export interface Children { - kind: string; - data: Data2; -} - -export interface Data2 { - approved_at_utc: any; - subreddit: string; - selftext: string; - author_fullname: string; - saved: boolean; - mod_reason_title: any; - gilded: number; - clicked: boolean; - title: string; - link_flair_richtext: LinkFlairRichtext[]; - subreddit_name_prefixed: string; - hidden: boolean; - pwls: any; - link_flair_css_class: string; - downs: number; - thumbnail_height?: number; - top_awarded_type: any; - hide_score: boolean; - name: string; - quarantine: boolean; - link_flair_text_color: string; - upvote_ratio: number; - author_flair_background_color?: string; - subreddit_type: string; - ups: number; - total_awards_received: number; - media_embed: MediaEmbed; - thumbnail_width?: number; - author_flair_template_id?: string; - is_original_content: boolean; - user_reports: any[]; - secure_media?: SecureMedia; - is_reddit_media_domain: boolean; - is_meta: boolean; - category: any; - secure_media_embed: SecureMediaEmbed; - link_flair_text: string; - can_mod_post: boolean; - score: number; - approved_by: any; - is_created_from_ads_ui: boolean; - author_premium: boolean; - thumbnail: string; - edited: boolean; - author_flair_css_class?: string; - author_flair_richtext: AuthorFlairRichtext[]; - gildings: Gildings; - post_hint?: string; - content_categories: any; - is_self: boolean; - mod_note: any; - created: number; - link_flair_type: string; - wls: any; - removed_by_category: any; - banned_by: any; - author_flair_type: string; - domain: string; - allow_live_comments: boolean; - selftext_html?: string; - likes: any; - suggested_sort?: string; - banned_at_utc: any; - view_count: any; - archived: boolean; - no_follow: boolean; - is_crosspostable: boolean; - pinned: boolean; - over_18: boolean; - preview?: Preview; - all_awardings: AllAwarding[]; - awarders: any[]; - media_only: boolean; - can_gild: boolean; - spoiler: boolean; - locked: boolean; - author_flair_text?: string; - treatment_tags: any[]; - visited: boolean; - removed_by: any; - num_reports: any; - distinguished: any; - subreddit_id: string; - author_is_blocked: boolean; - mod_reason_by: any; - removal_reason: any; - link_flair_background_color: string; - id: string; - is_robot_indexable: boolean; - report_reasons: any; - author: string; - discussion_type: any; - num_comments: number; - send_replies: boolean; - whitelist_status: any; - contest_mode: boolean; - mod_reports: any[]; - author_patreon_flair: boolean; - author_flair_text_color?: string; - permalink: string; - parent_whitelist_status: any; - stickied: boolean; - url: string; - subreddit_subscribers: number; - created_utc: number; - num_crossposts: number; - media?: Media; - is_video: boolean; - url_overridden_by_dest?: string; - link_flair_template_id?: string; - is_gallery?: boolean; - media_metadata?: MediaMetadata; - gallery_data?: GalleryData; -} - -export interface LinkFlairRichtext { - e: string; - t: string; -} - -export type MediaEmbed = {}; - -export interface SecureMedia { - reddit_video: RedditVideo; -} - -export interface RedditVideo { - bitrate_kbps: number; - fallback_url: string; - height: number; - width: number; - scrubber_media_url: string; - dash_url: string; - duration: number; - hls_url: string; - is_gif: boolean; - transcoding_status: string; -} - -export type SecureMediaEmbed = {}; - -export interface AuthorFlairRichtext { - e: string; - t: string; -} - -export type Gildings = {}; - -export interface Preview { - images: Image[]; - enabled: boolean; -} - -export interface Image { - source: Source; - resolutions: Resolution[]; - variants: Variants; - id: string; -} - -export interface Source { - url: string; - width: number; - height: number; -} - -export interface Resolution { - url: string; - width: number; - height: number; -} - -export interface Variants { - obfuscated?: Obfuscated; - nsfw?: Nsfw; -} - -export interface Obfuscated { - source: Source2; - resolutions: Resolution2[]; -} - -export interface Source2 { - url: string; - width: number; - height: number; -} - -export interface Resolution2 { - url: string; - width: number; - height: number; -} - -export interface Nsfw { - source: Source3; - resolutions: Resolution3[]; -} - -export interface Source3 { - url: string; - width: number; - height: number; -} - -export interface Resolution3 { - url: string; - width: number; - height: number; -} - -export interface AllAwarding { - giver_coin_reward: any; - subreddit_id?: string; - is_new: boolean; - days_of_drip_extension?: number; - coin_price: number; - id: string; - penny_donate: any; - award_sub_type: string; - coin_reward: number; - icon_url: string; - days_of_premium?: number; - tiers_by_required_awardings: any; - resized_icons: ResizedIcon[]; - icon_width: number; - static_icon_width: number; - start_date: any; - is_enabled: boolean; - awardings_required_to_grant_benefits: any; - description: string; - end_date: any; - sticky_duration_seconds: any; - subreddit_coin_reward: number; - count: number; - static_icon_height: number; - name: string; - resized_static_icons: ResizedStaticIcon[]; - icon_format?: string; - icon_height: number; - penny_price?: number; - award_type: string; - static_icon_url: string; -} - -export interface ResizedIcon { - url: string; - width: number; - height: number; -} - -export interface ResizedStaticIcon { - url: string; - width: number; - height: number; -} - -export interface Media { - reddit_video: RedditVideo2; -} - -export interface RedditVideo2 { - bitrate_kbps: number; - fallback_url: string; - height: number; - width: number; - scrubber_media_url: string; - dash_url: string; - duration: number; - hls_url: string; - is_gif: boolean; - transcoding_status: string; -} - -export interface MediaMetadata { - [s: string]: MediaMetadataChild; -} - -export interface MediaMetadataChild { - status: string; - e: string; - m: string; - p: P[]; - s: S; - id: string; -} - -export interface P { - y: number; - x: number; - u: string; -} - -export interface S { - y: number; - x: number; - u: string; -} - -export interface P2 { - y: number; - x: number; - u: string; -} - -export interface S2 { - y: number; - x: number; - u: string; -} - -export interface GalleryData { - items: Item[]; -} - -export interface Item { - media_id: string; - id: number; -} diff --git a/src/plugins/automeme.ts b/src/plugins/automeme.ts deleted file mode 100644 index e12566a..0000000 --- a/src/plugins/automeme.ts +++ /dev/null @@ -1,53 +0,0 @@ -// import { client } from "../client/Client"; -import { client } from "../client/Client"; -import { MovPlugin } from "../client/Plugin"; -import { ISettingsDB } from "../interfaces/database"; -import { debug } from "../utils/debug"; -import { pick } from "../utils/math"; -import { getSubreddit, parseToEmbed } from "../utils/reddit"; -import { summonWebhook } from "../utils/summonWebhook"; - -export default new MovPlugin("AutoMeme", { - event: "ready", - async run() { - setInterval(async () => { - const database = await client.database.settings.get( - process.env.SERVER_ID!, - ); - if (!database?.modules.autopost.enable) return; - - const auto = database.modules.autopost; - if (!auto.instances) return; - - for (const instance of auto.instances) { - const subreddit = instance.subreddits; - const picked = pick(subreddit); - - try { - const channel = client.getChannel(instance.channelId); - const fetchAPI = await getSubreddit(picked, { - limit: 25, - mediaOnly: true, - noNSFW: "nsfw" in channel ? !channel.nsfw : true, - }); - - if (fetchAPI.length < 1) { - debug("Empty result"); - return; - } - - const postPicked = pick(fetchAPI); - const e = parseToEmbed(postPicked); - await summonWebhook(instance.channelId, { - ...e.build(), - username: instance.name, - avatarURL: client.user.avatarURL, - }); - } catch (e) { - console.error(e); - return; - } - } - }, 1000 * 60 * 60 * 4); - }, -}); diff --git a/src/utils/reddit.ts b/src/utils/reddit.ts deleted file mode 100644 index 4ebd28a..0000000 --- a/src/utils/reddit.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { DateTime } from "luxon"; -import fetch from "node-fetch"; -import { MovEmbed } from "../client/Embed"; -import { Data2, Root } from "../interfaces/reddit"; - -export async function getSubreddit( - subreddit: string, - opt: { - limit?: number; - includeStickied?: boolean; - noNSFW?: boolean; - mediaOnly?: boolean; - } = { limit: 10, includeStickied: false, noNSFW: true, mediaOnly: false }, -) { - const now = DateTime.now().toMillis(); - const RedditStrikeTime = DateTime.fromISO( - "2023-06-11T22:00:00.123" - ).toMillis(); - if (now >= RedditStrikeTime) { - throw new Error( - "Reddit API is not longer avaliable due to black out until the CEO of Reddit will eventually revert this change!. Not even for 2 days!\nRead more at https://save3rdpartyapps.com/", - ); - } - const anyContent = await fetch( - `https://reddit.com/r/${encodeURIComponent(subreddit)}.json?limit=${opt.limit - }`, - ).then((r) => r.json()); - if (anyContent.error) { - throw new Error(`${anyContent.error}: ${anyContent.message}`); - } - let data = (anyContent as Root).data.children.map((m) => m.data); - if (!opt.includeStickied) { - data = data.filter((m) => !m.stickied); - } - if (opt.noNSFW) { - data = data.filter((m) => !m.over_18); - } - if (opt.mediaOnly) { - data = data.filter( - (m) => !!m.url.match(/.*(\.jp(e?)g$|\.png$|\.gif$)/g), - ); - } - return data; -} - -export function parseToEmbed(children: Data2) { - const realUTC = (children.created || children.created_utc) * 1000; - const source = `https://reddit.com${children.permalink}`; - - const e = new MovEmbed() - .setTitle(`${children.title.slice(0, 255)}`) - .setFooter(`u/${children.author} | r/${children.subreddit}`) - .setURL(source) - .setTimestamp(new Date(realUTC)); - - if (children.selftext.length > 0) { - e.setDesc( - children.selftext.length >= 2000 - ? `${children.selftext.slice(0, 2000)}\n[view more](${source})` - : children.selftext, - ); - } - if ( - !children.url.match(/http(s)?:\/\/.*(\.jpe?g$|\.png$|\.gif$)/g) && - children.thumbnail.startsWith("http") - ) { - e.setThumb(children.thumbnail); - } else if (children.url.startsWith("http")) { - e.setImage(children.url) - } - if (children.media_metadata) { - e.setImage(Object.values(children.media_metadata)[0].p[0].u); - } - - if (children.is_video) { - e.setDesc(`[Click to see video](${children.url})`); - } - - if ((children as Data2 & { crosspost_parent_list?: Array }).crosspost_parent_list?.length) { - e.setDesc(`[Crosspost](${(children as Data2 & { crosspost_parent_list: Array }).crosspost_parent_list[0].url})`) - } - - console.log(children) - - return e; -}