Thanks to visit codestin.com
Credit goes to github.com

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)