Created
September 7, 2023 07:18
-
-
Save Noxturnix/c7f935d831450bace2b4f9a0e2f45599 to your computer and use it in GitHub Desktop.
Revolt Typing Spammer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Revolt Typing Spammer | |
* Spam annoying typing status on Revolt channels. | |
* | |
* How to use: | |
* 1. Paste this script in the console. | |
* 2. Call `TypingSpam.addSpammer(channelId, interval)` where `channelId` is a string of a channel ID and `interval` is a number in millisecond to add a spammer. | |
* 3. Call `await TypingSpam.removeSpammer(channelId)` where `channelId` is a string of a channel ID to remove a spammer. | |
* | |
* Author | |
* Noxturnix (Noxturnix#6034) | |
* https://noxt.us/ | |
* | |
* License | |
* Copyright © 2023 Noxturnix | |
* This work is free. You can redistribute it and/or modify it under the | |
* terms of the Do What The Fuck You Want To Public License, Version 2, | |
* as published by Sam Hocevar. See http://www.wtfpl.net/ for more details. | |
*/ | |
class TypingSpam { | |
static Spammer = class { | |
#logName = "TypingSpam.Spammer"; | |
#toStop = false; | |
constructor(channel, interval) { | |
this.channel = channel; | |
this.interval = interval; | |
} | |
start() { | |
if (this.channel === undefined) { | |
this.#throwError("`channel` object is undefined."); | |
} | |
this.promise = this.#spam(); | |
return this.promise; | |
} | |
async stop() { | |
this.#toStop = true; | |
await this.promise; | |
} | |
async #spam() { | |
while (true) { | |
if (this.#toStop) return; | |
this.channel.startTyping(); | |
await this.#createSleepPromise(this.interval); | |
this.channel.stopTyping(); | |
if (this.#toStop) return; | |
await this.#createSleepPromise(this.interval); | |
} | |
} | |
#createSleepPromise(delay) { | |
return new Promise((resolve) => setTimeout(resolve, delay)); | |
} | |
#throwError(message) { | |
throw new Error(`[${this.#logName}] ${message}`); | |
} | |
} | |
static spammers = new Map(); | |
static #logName = "TypingSpam"; | |
static #client = controllers.client.getReadyClient(); | |
static #chromiumWarned = false; | |
static addSpammer(channelId, interval = 3e3) { | |
let existingSpammer = this.spammers.get(channelId); | |
if (existingSpammer !== undefined) { | |
this.#log(`Existing spammer found. Changing interval from ${existingSpammer.interval} to ${interval}.`); | |
existingSpammer.interval = interval; | |
return; | |
} | |
let channel = this.#client.channels.get(channelId); | |
let spammer = new this.Spammer(channel, interval); | |
this.spammers.set(channelId, spammer); | |
spammer.start(); | |
this.#log(`Started spamming with interval ${interval}.`); | |
if (!this.#chromiumWarned) { | |
this.#log("Note for Chromium users: Your Revolt window must be active for the timer to be accurate. This is due to browser's limitation for background processes.\nhttps://stackoverflow.com/a/6032591"); | |
this.#chromiumWarned = true; | |
} | |
} | |
static async removeSpammer(channelId) { | |
let spammer = this.spammers.get(channelId); | |
if (spammer === undefined) { | |
this.#log("Not spamming the channel."); | |
return; | |
} | |
await spammer.stop(); | |
this.spammers.delete(channelId); | |
this.#log("Spammer stopped and removed."); | |
} | |
static #log(message) { | |
console.log(`[${this.#logName}] ${message}`); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment