Skip to content

Commit d0daaf2

Browse files
committed
Merge branch 'costumer_mimic' of https://github.com/Pyra-Tech/Gagbot into costumer_mimic
2 parents d0921dc + 7cdcf75 commit d0daaf2

28 files changed

+394
-107
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Gagbot
2-
A bot for NSFW roleplay involving chat control on users! This is still under active development! The bot is written using Node.js and leverages the [Discord.js](https://discord.js.org/) library.
2+
A bot for NSFW roleplay involving chat control on users! This is still under active development! The bot is written using Node.js and leverages the [Discord.js](https://discord.js.org/) library. See [Setup](https://github.com/Enraa/Gagbot/blob/main/SETUP.md) for setting this project up.
33

44
### What is it?
55
This bot is designed to facilitate roleplay scenarios involving certain toys within a channel. This is intended for use only with consenting adults and should not be considered or tolerated in environments with users below that age. The effects are also strictly limited to moderately tasteful text and holds no NSFW graphics. This bot's focus is on facilitating the environments in which others can engage in that, if they so choose.

SETUP.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Setup
2+
### Requirements
3+
- [Node.js](https://nodejs.org/en/download) Version 20.15.1 or greater
4+
5+
### Initial Setup (Local)
6+
#### Step 1 - Get the Repo
7+
- Clone the git repo - **git clone <span>https:</span>//github.com/Enraa/Gagbot**
8+
- or [download the repo as a zip file](https://github.com/Enraa/Gagbot/archive/refs/heads/main.zip)
9+
10+
#### Step 2 - Get a Discord Developer Token
11+
- Navigate to the [Discord Developer Portal](https://discord.com/developers/applications) and sign in with your Discord account.
12+
- Create a New Application
13+
- Under Bot, scroll down to **Privileged Gateway Intents** and enable **Server Members Intent** and **Message Content Intent**.
14+
- Scroll back up to **Token** and click the **Reset Token** button. **Write down the token it provides.**
15+
- Under **Installation**, uncheck **User Install** and scroll to **Guild Install** scopes and add **bot**. It should already have **applications.commands**.
16+
- Navigate to the link provided under **Install Link**. This will join the bot to your server.
17+
18+
#### Step 3 - Set up the .env File
19+
- Copy the **.env.md** file provided in the project's directory and name the copy **.env**
20+
- Place the token noted above in the line under **DISCORDBOTTOKEN**.
21+
22+
#### Step 4 - Run the Bot
23+
- Navigate to the root of the directory you placed the bot in
24+
- Before running for the first time, install all of the node modules - **npm install**
25+
- Run the bot - **node index**
26+
27+
### Initial Setup (Docker)
28+
- Obtain a Discord Developer token and join the bot using the instructions under Step 2 above.
29+
- The following Docker Compose script can be used to spin the bot up on a Docker instance:
30+
```
31+
version: "3.9"
32+
33+
services:
34+
gagbot:
35+
build: https://github.com/Enraa/Gagbot.git
36+
image: gagbot
37+
volumes:
38+
- gagbotfilelocation:/mnt/GagbotFiles
39+
container_name: gagbot
40+
restart: unless-stopped
41+
environment:
42+
NODE_ENV: production
43+
DISCORDBOTTOKEN: "MTQ----------------a"
44+
GAGBOTFILEDIRECTORY: "/mnt/GagbotFiles"
45+
BACKUPDELAY: "3300000"
46+
SAVEDELAY: "120000"
47+
```
48+
This can be pasted into a new stack in Portainer or any other Docker container management. Note, you will want to ensure you set up a GAGBOTFILEDIRECTORY and point it appropriately to a storage the container has read/write access to. This will ensure the data persists across container restarts.
49+
50+
### Using the Bot
51+
#### Step 1 - Setup a Channel
52+
- In the server that the bot has been joined to, ensure that it either has role or channel specific permissions:
53+
- **View Channel**
54+
- **Manage Messages**
55+
- **Manage Webhooks**
56+
- **Manage Threads** (optional)
57+
- **Send Messages in Threads** (optional)
58+
#### Step 1a - Setup a Webhook (optional, but highly recommended!)
59+
- While the bot can setup webhooks for you, the webhook will not be able to use external emoji. To get around this issue, you *must* create a Webhook inside the channel the bot will be running in and call it **Gagbot**. Once created, the bot should be able to pick it up and use it in the next step.
60+
#### Step 2 - Configure the Bot for the Server
61+
- Type **/config** to bring up the Bot's configuration menu. Server moderators (those with a role that has **Manage Messages**) can see the Server Settings menu. In there, click the button to setup an initial configuration. This will also deploy all of the other commands.
62+
- Select the channel you want the bot to function in. It will save only if it has the required permissions above.
63+
- Use the bot!

commands/inspect.js

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ module.exports = {
3737
// Gag status
3838
// You can easily feel if you're gagged, so no restrictions here
3939
if (getGag(inspectuser.id)) {
40-
let inspecttext = `<:Gag:1073495437635506216> Gag: **`;
40+
let inspecttext = `${process.emojis.gag} Gag: **`;
4141
getGags(inspectuser.id).forEach((g) => {
4242
inspecttext = `${inspecttext}${convertGagText(g.gagtype)} (${g.intensity}), `;
4343
});
4444
inspecttext = `${inspecttext.slice(0, -2)}**`;
4545
inspectparts.push(inspecttext);
4646
} else {
47-
inspectparts.push(`<:Gag:1073495437635506216> Gag: Not currently worn.`);
47+
inspectparts.push(`${process.emojis.gag} Gag: Not currently worn.`);
4848
}
4949
// Headwear parts!
5050
console.log(getHeadwear(inspectuser.id));
@@ -71,12 +71,12 @@ module.exports = {
7171
// You can easily feel if you're wearing mittens, so no restrictions
7272
if (getMitten(inspectuser.id)) {
7373
if (getMittenName(inspectuser.id)) {
74-
inspectparts.push(`<:mittens:1452425463757803783> Mittens: **${getMittenName(inspectuser.id)}**`);
74+
inspectparts.push(`${process.emojis.mitten} Mittens: **${getMittenName(inspectuser.id)}**`);
7575
} else {
76-
inspectparts.push(`<:mittens:1452425463757803783> Mittens: **WORN**`);
76+
inspectparts.push(`${process.emojis.mitten} Mittens: **WORN**`);
7777
}
7878
} else {
79-
inspectparts.push(`<:mittens:1452425463757803783> Mittens: Not currently worn.`);
79+
inspectparts.push(`${process.emojis.mitten} Mittens: Not currently worn.`);
8080
}
8181
// Wearable status
8282
// You probably can't really tell what you're wearing but...
@@ -109,12 +109,12 @@ module.exports = {
109109
// Vibe status
110110
if (getVibe(inspectuser.id)) {
111111
inspectparts.push(
112-
`<:MagicWand:1073504682540011520> Vibrators/toys: **${getVibe(inspectuser.id)
112+
`${process.emojis.wand} Vibrators/toys: **${getVibe(inspectuser.id)
113113
.map((vibe) => `${vibe.vibetype} (${vibe.intensity})`)
114114
.join(", ")}**`,
115115
);
116116
} else {
117-
inspectparts.push(`<:MagicWand:1073504682540011520> Vibrator: Not currently worn.`);
117+
inspectparts.push(`${process.emojis.wand} Vibrator: Not currently worn.`);
118118
}
119119
// Arousal status
120120
// You can *definitely* tell how horny you are, so no restrictions
@@ -145,19 +145,19 @@ module.exports = {
145145
}
146146
if (!headwearrestrictions.canInspect) {
147147
// Wearer is blind - they can only tell its on and locked. Nothing more.
148-
inspectparts.push(`<:Chastity:1073495208861380629> Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Locked (blind)**`);
148+
inspectparts.push(`${process.emojis.chastity} Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Locked (blind)**`);
149149
} else if (getChastity(inspectuser.id).keyholder == "discarded") {
150-
inspectparts.push(`<:Chastity:1073495208861380629> Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing!**`);
150+
inspectparts.push(`${process.emojis.chastity} Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing!**`);
151151
} else if (getChastityTimelock(inspectuser.id)) {
152-
inspectparts.push(`<:Chastity:1073495208861380629> Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **${timelockedtext} until ${getChastityTimelock(inspectuser.id, true)}**`);
152+
inspectparts.push(`${process.emojis.chastity} Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **${timelockedtext} until ${getChastityTimelock(inspectuser.id, true)}**`);
153153
} else if (getChastity(inspectuser.id).keyholder == inspectuser.id) {
154154
// Self bound!
155-
inspectparts.push(`<:Chastity:1073495208861380629> Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Self-bound!**`);
155+
inspectparts.push(`${process.emojis.chastity} Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Self-bound!**`);
156156
} else {
157-
inspectparts.push(`<:Chastity:1073495208861380629> Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getChastity(inspectuser.id).keyholder}>**`);
157+
inspectparts.push(`${process.emojis.chastity} Chastity Belt: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getChastity(inspectuser.id).keyholder}>**`);
158158
}
159159
} else {
160-
inspectparts.push(`<:Chastity:1073495208861380629> Chastity Belt: Not currently worn.`);
160+
inspectparts.push(`${process.emojis.chastity} Chastity Belt: Not currently worn.`);
161161
}
162162
// Chastity Bra status.
163163
// You'll be able to tell that it's locked, but nothing more.
@@ -178,41 +178,41 @@ module.exports = {
178178
}
179179
if (!headwearrestrictions.canInspect) {
180180
// Wearer is blind - they can only tell its on and locked. Nothing more.
181-
inspectparts.push(`<:chastitybra:1457992137164718152> Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Locked (blind)**`);
181+
inspectparts.push(`${process.emojis.chastitybra} Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Locked (blind)**`);
182182
} else if (getChastityBra(inspectuser.id).keyholder == "discarded") {
183-
inspectparts.push(`<:chastitybra:1457992137164718152> Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing!**`);
183+
inspectparts.push(`${process.emojis.chastitybra} Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing!**`);
184184
} else if (getChastityBraTimelock(inspectuser.id)) {
185-
inspectparts.push(`<:chastitybra:1457992137164718152> Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **${timelockedtext} until ${getChastityTimelock(inspectuser.id, true)}**`);
185+
inspectparts.push(`${process.emojis.chastitybra} Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **${timelockedtext} until ${getChastityTimelock(inspectuser.id, true)}**`);
186186
} else if (getChastityBra(inspectuser.id).keyholder == inspectuser.id) {
187187
// Self bound!
188-
inspectparts.push(`<:chastitybra:1457992137164718152> Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Self-bound!**`);
188+
inspectparts.push(`${process.emojis.chastitybra} Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Self-bound!**`);
189189
} else {
190-
inspectparts.push(`<:chastitybra:1457992137164718152> Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getChastityBra(inspectuser.id).keyholder}>**`);
190+
inspectparts.push(`${process.emojis.chastitybra} Chastity Bra: **${currentchastitybelt}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getChastityBra(inspectuser.id).keyholder}>**`);
191191
}
192192
} else {
193-
inspectparts.push(`<:chastitybra:1457992137164718152> Chastity Bra: Not currently worn.`);
193+
inspectparts.push(`${process.emojis.chastitybra} Chastity Bra: Not currently worn.`);
194194
}
195195
// Corset status
196196
// Can probably easily tell how tight it is by how shallow your breathing is. No restrictions.
197197
if (getCorset(inspectuser.id)) {
198198
if (getCorset(inspectuser.id).tightness > 10) {
199-
inspectparts.push(`<:corset:1451126998192881684> Corset: **Laced beyond reason to a string length of ${getCorset(inspectuser.id).tightness}**`);
199+
inspectparts.push(`${process.emojis.corset} Corset: **Laced beyond reason to a string length of ${getCorset(inspectuser.id).tightness}**`);
200200
} else if (getCorset(inspectuser.id).tightness > 7) {
201-
inspectparts.push(`<:corset:1451126998192881684> Corset: **Laced tightly to a string length of ${getCorset(inspectuser.id).tightness}**`);
201+
inspectparts.push(`${process.emojis.corset} Corset: **Laced tightly to a string length of ${getCorset(inspectuser.id).tightness}**`);
202202
} else if (getCorset(inspectuser.id).tightness > 4) {
203-
inspectparts.push(`<:corset:1451126998192881684> Corset: **Laced moderately to a string length of ${getCorset(inspectuser.id).tightness}**`);
203+
inspectparts.push(`${process.emojis.corset} Corset: **Laced moderately to a string length of ${getCorset(inspectuser.id).tightness}**`);
204204
} else {
205-
inspectparts.push(`<:corset:1451126998192881684> Corset: **Laced loosely to a string length of ${getCorset(inspectuser.id).tightness}**`);
205+
inspectparts.push(`${process.emojis.corset} Corset: **Laced loosely to a string length of ${getCorset(inspectuser.id).tightness}**`);
206206
}
207207
} else {
208-
inspectparts.push(`<:corset:1451126998192881684> Corset: Not currently worn.`);
208+
inspectparts.push(`${process.emojis.corset} Corset: Not currently worn.`);
209209
}
210210
// Heavy Bondage status
211211
// Bendy arms are uncomfortable! Easy to tell! No restrictions!
212212
if (getHeavy(inspectuser.id)) {
213-
inspectparts.push(`<:Armbinder:1073495590656286760> Heavy Bondage: **${getHeavy(inspectuser.id).type}**`);
213+
inspectparts.push(`${process.emojis.armbinder} Heavy Bondage: **${getHeavy(inspectuser.id).type}**`);
214214
} else {
215-
inspectparts.push(`<:Armbinder:1073495590656286760> Heavy Bondage: Not currently worn.`);
215+
inspectparts.push(`${process.emojis.armbinder} Heavy Bondage: Not currently worn.`);
216216
}
217217
// Collar status
218218
// You'll be able to tell that it's locked, but nothing more.
@@ -234,33 +234,33 @@ module.exports = {
234234
}
235235
if (!headwearrestrictions.canInspect) {
236236
// Wearer is blind - they can only tell its on and locked. Nothing more.
237-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Locked (blind)**`);
237+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Locked (blind)**`);
238238
} else if (getCollar(inspectuser.id).keyholder == "discarded") {
239239
// Self bound!
240240
if (getCollar(inspectuser.id).keyholder_only) {
241-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing!**`);
241+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing!**`);
242242
} else {
243-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing! Free Use!**`);
243+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Keys are Missing! Free Use!**`);
244244
}
245245
} else if (getCollarTimelock(inspectuser.id)) {
246-
inspectparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **${timelockedtext} until ${getCollarTimelock(inspectuser.id, true)}**`);
246+
inspectparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **${timelockedtext} until ${getCollarTimelock(inspectuser.id, true)}**`);
247247
} else if (!getCollar(inspectuser.id).keyholder_only) {
248248
// Free use!
249249
if (getCollar(inspectuser.id).keyholder == inspectuser.id) {
250-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Self-bound and free use!**`);
250+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Self-bound and free use!**`);
251251
} else {
252-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getCollar(inspectuser.id).keyholder}>, free use!**`);
252+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getCollar(inspectuser.id).keyholder}>, free use!**`);
253253
}
254254
} else if (getCollar(inspectuser.id).keyholder == inspectuser.id) {
255255
// Self bound!
256-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Self-bound!**`);
256+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Self-bound!**`);
257257
} else {
258-
collarparts.push(`<:collar:1449984183261986939> Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getCollar(inspectuser.id).keyholder}>**`);
258+
collarparts.push(`${process.emojis.collar} Collar: **${currentcollartext}**\n-# ‎ ⤷ ${lockemoji} **Key held by <@${getCollar(inspectuser.id).keyholder}>**`);
259259
}
260260
// Output Collar Perms
261261
collarparts.push(`-# Mittens: ${getCollarPerm(inspectuser.id, "mitten") ? "YES" : "NO"}, Chastity: ${getCollarPerm(inspectuser.id, "chastity") ? "YES" : "NO"}, Heavy: ${getCollarPerm(inspectuser.id, "heavy") ? "YES" : "NO"}, Masks: ${getCollarPerm(inspectuser.id, "mask") ? "YES" : "NO"}`);
262262
} else {
263-
collarparts.push(`<:collar:1449984183261986939> Collar: Not currently worn.`);
263+
collarparts.push(`${process.emojis.collar} Collar: Not currently worn.`);
264264
}
265265
inspectparts.push(collarparts.join("\n"));
266266
inspectparts.push(" ");

0 commit comments

Comments
 (0)