Skip to content

Commit 15daaf8

Browse files
committed
Implement more flexible poll command
1 parent 78fb16b commit 15daaf8

File tree

10 files changed

+274
-67
lines changed

10 files changed

+274
-67
lines changed

dist/commands/poll.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
return new (P || (P = Promise))(function (resolve, reject) {
4+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7+
step((generator = generator.apply(thisArg, _arguments || [])).next());
8+
});
9+
};
10+
Object.defineProperty(exports, "__esModule", { value: true });
11+
const discord_js_1 = require("discord.js");
12+
const constants_1 = require("../constants");
13+
const NUMBER_SYMBOLS = [
14+
constants_1.SYMBOL_ONE,
15+
constants_1.SYMBOL_TWO,
16+
constants_1.SYMBOL_THREE,
17+
constants_1.SYMBOL_FOUR,
18+
constants_1.SYMBOL_FIVE,
19+
];
20+
const NUMBER_EMOJIES = [
21+
constants_1.EMOJI_ONE,
22+
constants_1.EMOJI_TWO,
23+
constants_1.EMOJI_THREE,
24+
constants_1.EMOJI_FOUR,
25+
constants_1.EMOJI_FIVE,
26+
];
27+
function pollCommand(match, message) {
28+
return __awaiter(this, void 0, void 0, function* () {
29+
const hasOptions = new RegExp("--options", "i").test(match[1]);
30+
const pollQuestion = hasOptions === true ? match[1].match(/(.+)--options.+/i)[1].trim() : match[1].trim(); // Extract question from the match
31+
const pollOptions = hasOptions && match[1].match(/--options\s+?(.+)/i)[1].split(" ").slice(0, 5); // Extract poll options
32+
// const pollTimeout: number = parseInt(match[2], 10);
33+
const pollDescription = hasOptions ? pollOptions.reduce((acc, curr, currIndex) => {
34+
return acc += `${NUMBER_SYMBOLS[currIndex]} - ${curr}\n`;
35+
}, "") : "";
36+
const embedOptions = {
37+
title: pollQuestion,
38+
description: pollDescription,
39+
};
40+
const embed = new discord_js_1.RichEmbed(embedOptions);
41+
try {
42+
const botMessage = (yield message.channel.send("@everyone:", embed));
43+
if (hasOptions && pollOptions.length > 0) {
44+
let currIndex = 0;
45+
/**
46+
* Asynchronously add emojies!
47+
*/
48+
function addEmoji() {
49+
botMessage.react(NUMBER_EMOJIES[currIndex])
50+
.then(() => {
51+
currIndex++;
52+
if (currIndex < pollOptions.length) {
53+
addEmoji();
54+
}
55+
});
56+
}
57+
addEmoji();
58+
// pollOptions.forEach(async (option: string, index: number) => {
59+
// });
60+
}
61+
else {
62+
const yesReaction = yield botMessage.react(constants_1.THUMBS_UP);
63+
const noReaction = yield botMessage.react(constants_1.THUMBS_DOWN);
64+
}
65+
if (message.deletable) {
66+
message.delete();
67+
}
68+
// Canister.on("messageReactionAdd", async (reaction: MessageReaction, { username }: User) => {
69+
// if (reaction.message.id === botMessage.id) {
70+
// console.log(`${username} has voted! total: ${reaction.count}`);
71+
// }
72+
// });
73+
// setTimeout(() => {
74+
// botMessage.delete();
75+
// }, pollTimeout * 1000);
76+
}
77+
catch (err) {
78+
console.error(err);
79+
}
80+
});
81+
}
82+
exports.default = pollCommand;

dist/constants/constants.js

Whitespace-only changes.

dist/constants/index.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const THUMBS_UP = "👍";
4+
exports.THUMBS_UP = THUMBS_UP;
5+
const THUMBS_DOWN = "👎";
6+
exports.THUMBS_DOWN = THUMBS_DOWN;
7+
const SYMBOL_ONE = "1⃣ "; // "1️⃣";
8+
exports.SYMBOL_ONE = SYMBOL_ONE;
9+
const SYMBOL_TWO = "2⃣ "; // "2️⃣";
10+
exports.SYMBOL_TWO = SYMBOL_TWO;
11+
const SYMBOL_THREE = "3⃣ "; // "3️⃣";
12+
exports.SYMBOL_THREE = SYMBOL_THREE;
13+
const SYMBOL_FOUR = "4⃣ "; // "4️⃣";
14+
exports.SYMBOL_FOUR = SYMBOL_FOUR;
15+
const SYMBOL_FIVE = "5⃣ "; // "5️⃣";
16+
exports.SYMBOL_FIVE = SYMBOL_FIVE;
17+
const EMOJI_ONE = "1%E2%83%A3";
18+
exports.EMOJI_ONE = EMOJI_ONE;
19+
const EMOJI_TWO = "2%E2%83%A3";
20+
exports.EMOJI_TWO = EMOJI_TWO;
21+
const EMOJI_THREE = "3%E2%83%A3";
22+
exports.EMOJI_THREE = EMOJI_THREE;
23+
const EMOJI_FOUR = "4%E2%83%A3";
24+
exports.EMOJI_FOUR = EMOJI_FOUR;
25+
const EMOJI_FIVE = "5%E2%83%A3";
26+
exports.EMOJI_FIVE = EMOJI_FIVE;

dist/main.js

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,43 +9,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
99
};
1010
Object.defineProperty(exports, "__esModule", { value: true });
1111
const discord_js_1 = require("discord.js");
12+
const poll_1 = require("./commands/poll");
1213
const Canister = new discord_js_1.Client();
13-
const THUMBS_UP = "👍";
14-
const THUMBS_DOWN = "👎";
1514
Canister.on("ready", () => {
1615
console.log("I am ready!");
1716
});
18-
function allowThumbsOnly(reaction, user) {
19-
return reaction.emoji.name === THUMBS_UP || reaction.emoji.name === THUMBS_DOWN;
20-
}
2117
Canister.on("message", (message) => __awaiter(this, void 0, void 0, function* () {
22-
const matched = message.content.match(/^!poll\s+?(.+)/i); // \s+?(\d)
23-
if (matched && matched.index !== -1) {
24-
const pollQuestion = matched[1];
25-
const pollTimeout = parseInt(matched[2], 10);
26-
const embedOptions = {
27-
title: pollQuestion,
28-
};
29-
const embed = new discord_js_1.RichEmbed(embedOptions);
30-
try {
31-
const botMessage = yield message.channel.send("@everyone:", embed);
32-
const yesReaction = yield botMessage.react(THUMBS_UP);
33-
const noReaction = yield botMessage.react(THUMBS_DOWN);
34-
if (message.deletable) {
35-
message.delete();
36-
}
37-
// Canister.on("messageReactionAdd", async (reaction: MessageReaction, { username }: User) => {
38-
// if (reaction.message.id === botMessage.id) {
39-
// console.log(`${username} has voted! total: ${reaction.count}`);
40-
// }
41-
// });
42-
// setTimeout(() => {
43-
// botMessage.delete();
44-
// }, pollTimeout * 1000);
45-
}
46-
catch (err) {
47-
console.error(err);
48-
}
18+
const pollMatch = message.content.match(/!poll\s+?(.+)/i); // \s+?(\d)
19+
if (pollMatch && pollMatch.index !== -1) {
20+
poll_1.default(pollMatch, message);
4921
}
5022
}));
51-
Canister.login(process.env.BOT_TOKEN);
23+
Canister.login("NDA2NzE2NDUzMjQ5ODc1OTc4.DU2_3Q.Rs1uan257S1JnU7WA2UniqKhHtc");

dist/utils/allowThumbsOnly.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
const constants_1 = require("../constants");
4+
/**
5+
* Return true if thumbs are passed in, else false.
6+
* @export
7+
* @param {MessageReaction} reaction
8+
* @param {User} user
9+
* @returns boolean
10+
*/
11+
function allowThumbsOnly(reaction, user) {
12+
return reaction.emoji.name === constants_1.THUMBS_UP || reaction.emoji.name === constants_1.THUMBS_DOWN;
13+
}
14+
exports.default = allowThumbsOnly;

src/commands/poll.ts

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import {
2+
Message,
3+
MessageReaction,
4+
RichEmbed,
5+
RichEmbedOptions,
6+
User,
7+
} from "discord.js";
8+
import {
9+
THUMBS_UP,
10+
THUMBS_DOWN,
11+
SYMBOL_ONE,
12+
SYMBOL_TWO,
13+
SYMBOL_THREE,
14+
SYMBOL_FOUR,
15+
SYMBOL_FIVE,
16+
EMOJI_ONE,
17+
EMOJI_TWO,
18+
EMOJI_THREE,
19+
EMOJI_FOUR,
20+
EMOJI_FIVE,
21+
} from "../constants";
22+
import { strictEqual } from "assert";
23+
24+
const NUMBER_SYMBOLS: string[] = [
25+
SYMBOL_ONE,
26+
SYMBOL_TWO,
27+
SYMBOL_THREE,
28+
SYMBOL_FOUR,
29+
SYMBOL_FIVE,
30+
];
31+
32+
const NUMBER_EMOJIES: string[] = [
33+
EMOJI_ONE,
34+
EMOJI_TWO,
35+
EMOJI_THREE,
36+
EMOJI_FOUR,
37+
EMOJI_FIVE,
38+
];
39+
40+
async function pollCommand(match: any[], message: Message) {
41+
const hasOptions: boolean = new RegExp("--options", "i").test(match[1]);
42+
const pollQuestion: string = hasOptions === true ? match[1].match(/(.+)--options.+/i)[1].trim() : match[1].trim(); // Extract question from the match
43+
const pollOptions: string[] = hasOptions && match[1].match(/--options\s+?(.+)/i)[1].split(" ").slice(0, 5); // Extract poll options
44+
// const pollTimeout: number = parseInt(match[2], 10);
45+
const pollDescription: string = hasOptions ? pollOptions.reduce((acc: string, curr: string, currIndex: number) => {
46+
return acc += `${NUMBER_SYMBOLS[currIndex]} - ${curr}\n`;
47+
}, "") : "";
48+
const embedOptions: RichEmbedOptions = {
49+
title: pollQuestion,
50+
description: pollDescription,
51+
};
52+
const embed: RichEmbed = new RichEmbed(embedOptions);
53+
try {
54+
const botMessage: Message = (await message.channel.send(
55+
"@everyone:",
56+
embed,
57+
)) as Message;
58+
if (hasOptions && pollOptions.length > 0) {
59+
let currIndex: number = 0;
60+
/**
61+
* Asynchronously add emojies!
62+
*/
63+
function addEmoji() {
64+
botMessage.react(NUMBER_EMOJIES[currIndex])
65+
.then(() => {
66+
currIndex++;
67+
if (currIndex < pollOptions.length) {
68+
addEmoji();
69+
}
70+
});
71+
}
72+
73+
addEmoji();
74+
75+
// pollOptions.forEach(async (option: string, index: number) => {
76+
// });
77+
} else {
78+
const yesReaction: MessageReaction = await botMessage.react(THUMBS_UP);
79+
const noReaction: MessageReaction = await botMessage.react(THUMBS_DOWN);
80+
}
81+
if (message.deletable) {
82+
message.delete();
83+
}
84+
// Canister.on("messageReactionAdd", async (reaction: MessageReaction, { username }: User) => {
85+
// if (reaction.message.id === botMessage.id) {
86+
// console.log(`${username} has voted! total: ${reaction.count}`);
87+
// }
88+
// });
89+
// setTimeout(() => {
90+
// botMessage.delete();
91+
// }, pollTimeout * 1000);
92+
} catch (err) {
93+
console.error(err);
94+
}
95+
}
96+
97+
export default pollCommand;

src/constants/index.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const THUMBS_UP: string = "👍";
2+
const THUMBS_DOWN: string = "👎";
3+
const SYMBOL_ONE: string = "1⃣ "; // "1️⃣";
4+
const SYMBOL_TWO: string = "2⃣ "; // "2️⃣";
5+
const SYMBOL_THREE: string = "3⃣ "; // "3️⃣";
6+
const SYMBOL_FOUR: string = "4⃣ "; // "4️⃣";
7+
const SYMBOL_FIVE: string = "5⃣ "; // "5️⃣";
8+
9+
const EMOJI_ONE: string = "1%E2%83%A3";
10+
const EMOJI_TWO: string = "2%E2%83%A3";
11+
const EMOJI_THREE: string = "3%E2%83%A3";
12+
const EMOJI_FOUR: string = "4%E2%83%A3";
13+
const EMOJI_FIVE: string = "5%E2%83%A3";
14+
export {
15+
THUMBS_UP,
16+
THUMBS_DOWN,
17+
SYMBOL_ONE,
18+
SYMBOL_TWO,
19+
SYMBOL_THREE,
20+
SYMBOL_FOUR,
21+
SYMBOL_FIVE,
22+
EMOJI_ONE,
23+
EMOJI_TWO,
24+
EMOJI_THREE,
25+
EMOJI_FOUR,
26+
EMOJI_FIVE,
27+
};

src/main.ts

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,17 @@
1-
import { Client, Emoji, Message, MessageReaction, RichEmbed, RichEmbedOptions, User, Collector } from "discord.js";
1+
import { Client, Message } from "discord.js";
2+
3+
import pollCommand from "./commands/poll";
24

35
const Canister = new Client();
4-
const THUMBS_UP = "👍";
5-
const THUMBS_DOWN = "👎";
66

77
Canister.on("ready", () => {
88
console.log("I am ready!");
99
});
1010

11-
function allowThumbsOnly(reaction: MessageReaction, user: User) {
12-
return reaction.emoji.name === THUMBS_UP || reaction.emoji.name === THUMBS_DOWN;
13-
}
14-
1511
Canister.on("message", async (message: Message) => {
16-
const matched = message.content.match(/^!poll\s+?(.+)/i); // \s+?(\d)
17-
if (matched && matched.index !== -1) {
18-
const pollQuestion: string = matched[1];
19-
const pollTimeout: number = parseInt(matched[2], 10);
20-
const embedOptions: RichEmbedOptions = {
21-
title: pollQuestion,
22-
};
23-
const embed: RichEmbed = new RichEmbed(embedOptions);
24-
try {
25-
const botMessage: Message = await message.channel.send("@everyone:", embed) as Message;
26-
const yesReaction: MessageReaction = await botMessage.react(THUMBS_UP);
27-
const noReaction: MessageReaction = await botMessage.react(THUMBS_DOWN);
28-
if (message.deletable) {
29-
message.delete();
30-
}
31-
// Canister.on("messageReactionAdd", async (reaction: MessageReaction, { username }: User) => {
32-
// if (reaction.message.id === botMessage.id) {
33-
// console.log(`${username} has voted! total: ${reaction.count}`);
34-
// }
35-
// });
36-
// setTimeout(() => {
37-
// botMessage.delete();
38-
// }, pollTimeout * 1000);
39-
} catch (err) {
40-
console.error(err);
41-
}
12+
const pollMatch = message.content.match(/!poll\s+?(.+)/i); // \s+?(\d)
13+
if (pollMatch && pollMatch.index !== -1) {
14+
pollCommand(pollMatch, message);
4215
}
4316
});
4417
Canister.login(process.env.BOT_TOKEN);

src/utils/allowThumbsOnly.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { MessageReaction, User } from "discord.js";
2+
import { THUMBS_DOWN, THUMBS_UP } from "../constants";
3+
4+
/**
5+
* Return true if thumbs are passed in, else false.
6+
* @export
7+
* @param {MessageReaction} reaction
8+
* @param {User} user
9+
* @returns boolean
10+
*/
11+
export default function allowThumbsOnly(reaction: MessageReaction, user: User) {
12+
return reaction.emoji.name === THUMBS_UP || reaction.emoji.name === THUMBS_DOWN;
13+
}

tslint.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
],
66
"jsRules": {},
77
"rules": {
8-
"no-console": false
8+
"no-console": false,
9+
"object-literal-sort-keys": false,
10+
"ordered-imports": false,
11+
"max-line-length": false
912
},
1013
"rulesDirectory": []
1114
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy