· 4 years ago · Oct 12, 2020, 06:40 PM
1import tmi from 'tmi.js'
2import {BOT_USERNAME, OAUTH_TOKEN} from './constants'
3
4const sqlite3 = require('sqlite3').verbose();
5
6// Login info and channels
7const options = {
8 options: { debug: true },
9 connection: {
10 reconnect: true,
11 secure: true
12 },
13 identity: {
14 username: BOT_USERNAME,
15 password: OAUTH_TOKEN
16 },
17 channels: ["captinturtle1"]
18}
19
20const client = new tmi.Client(options);
21
22client.connect().catch(console.error);
23
24// this is ran every message
25client.on('message', (channel, userstate, message, self) => {
26 if(self) return;
27 if (userstate.badges == null)return;
28 if (userstate.badges.moderator == 1 || userstate.badges.broadcaster == 1) {
29
30 // breaking down the message if its a command
31 let prefix = "!";
32 let messageArray = message.split(" ");
33 let cmd = messageArray[0];
34 let argsArray = messageArray.slice(1, 2);
35 let argsString = argsArray.toString();
36 let args = argsString.toLowerCase();
37
38 // !commands command
39 if(cmd.toLowerCase() === `${prefix}commands`) {
40 client.say(channel, '!shadowrealm, !deshadowrealm, !shadowrealmlist, !refreshshadowrealm, !clearshadowrealm');
41 }
42
43 // !hello command
44 if(cmd.toLowerCase() === `${prefix}ping`) {
45 client.say(channel, `pong`);
46 }
47
48 // !shadowrealm (name) command
49 if(cmd.toLowerCase() === `${prefix}shadowrealm`) {
50 sendToShadowRealm(args, channel);
51 }
52
53 // !deshadowrealm (nane) command
54 if(cmd.toLowerCase() === `${prefix}deshadowrealm`) {
55 saveFromTheShadowRealm(args, channel);
56 }
57
58 // !shadowrealmlist command
59 if(cmd.toLowerCase() === `${prefix}shadowrealmlist`){
60 showUsersInTheShadows(channel);
61 }
62
63 // !refreshshadowrealm command
64 if(cmd.toLowerCase() === `${prefix}refreshshadowrealm`){
65 refreshTimeouts(channel);
66 }
67
68 // !clearshadowrealm command
69 if(cmd.toLowerCase() === `${prefix}clearshadowrealm`){
70 clearTheShadowRealm(channel);
71 }
72 }
73});
74
75/*
76client.on("timeout", (channel, username, reason, duration, userstate) => {
77 if(duration == 1209600) {
78 sendToShadowRealm(username, channel)
79 }
80});
81*/
82
83// putting persons name in table when !shadowrealm (name) is used
84function sendToShadowRealm(username, channel){
85
86 console.log("Sending " + username + " to the shadowrealm")
87
88 // connecting and defining db
89 let db = new sqlite3.Database('./shadowRealmDB.db', (err) => {
90 if (err) {
91 console.error(err.message);
92 }
93 console.log('Connected to the database.');
94 });
95
96 // sql code
97 db.run(`INSERT INTO usersInTheRealm(usernames, created_at) VALUES(?, datetime())`, [username], function(err) {
98 if (err) {
99 client.say(channel, `user is already in the shadowrealm, or something broke`);
100 return console.log(err.message);
101 }
102 // get the last insert id
103 console.log(`Row(s) inserted ${this.changes}`);
104 if (this.changes === 1){
105 client.say(channel, `${username} will never be seen again`);
106 } else{
107 client.say(channel, `something broke`);
108 }
109 });
110
111 // closing db connection
112 db.close((err) => {
113 if (err) {
114 return console.error(err.message);
115 }
116 });
117}
118
119// removing persons name in table when !deshadowrealm (name) is used
120function saveFromTheShadowRealm(username, channel){
121
122 console.log("Saving " + username + " from the shadowrealm")
123
124 // connecting and defining db
125 let db = new sqlite3.Database('./shadowRealmDB.db', (err) => {
126 if (err) {
127 console.error(err.message);
128 }
129 console.log('Connected to the database.');
130 });
131
132 // sql code
133 db.run(`DELETE FROM usersInTheRealm WHERE usernames=?`, [username], function(err) {
134 if (err) {
135 return console.log(err.message);
136 }
137 // get the last insert id
138 console.log(`Row(s) deleted ${this.changes}`);
139 if (this.changes === 1){
140 client.say(channel, `${username} has been saved from the shadowrealm`);
141 } else{
142 client.say(channel, `that person is not in the shadowrealm`);
143 }
144 });
145
146 // closing db connection
147 db.close((err) => {
148 if (err) {
149 return console.error(err.message);
150 }
151 });
152}
153
154// lists the usernames of people in the shadowrealm table when !list is used
155function showUsersInTheShadows(channel){
156
157 console.log("Showing list of people in the shadows")
158
159 // connecting and defining db
160 let db = new sqlite3.Database('./shadowRealmDB.db', (err) => {
161 if (err) {
162 console.error(err.message);
163 }
164 console.log('Connected to the database.');
165 });
166
167 // sql code
168 let sql = `SELECT DISTINCT usernames FROM usersInTheRealm ORDER BY id`;
169
170 db.all(sql, [], (err, rows) => {
171 if (err) {
172 throw err;
173 }
174
175 var rowNames = [ ]
176
177 rows.forEach((row) => {
178 rowNames.push(" " + row.usernames);
179 });
180
181 client.say(channel, `${rowNames}`);
182 });
183
184 // closing db connection
185 db.close((err) => {
186 if (err) {
187 return console.error(err.message);
188 }
189 });
190}
191
192// cycles through shadowrealm table and times out every user for another 2 weeks
193function refreshTimeouts(channel){
194
195 console.log("Refreshing Shadowrealm Timeouts")
196
197 // connecting and defining db
198 let db = new sqlite3.Database('./shadowRealmDB.db', (err) => {
199 if (err) {
200 console.error(err.message);
201 }
202 console.log('Connected to the database.');
203 });
204
205 // sql code
206 let sql = `SELECT DISTINCT usernames FROM usersInTheRealm ORDER BY id`;
207
208 db.all(sql, [], (err, rows) => {
209 if (err) {
210 throw err;
211 }
212
213 let delay = (50);
214 rows.forEach((row) => {
215 delay = delay + 50;
216 let currentUsername = row.usernames;
217 setTimeout(function(){client.timeout(channel, currentUsername, 1209600, "sent to the shadowrealm");}, delay);
218 });
219 });
220
221 // closing db connecting
222 db.close((err) => {
223 if (err) {
224 return console.error(err.message);
225 }
226 });
227}
228
229// clears shadowrealm
230function clearTheShadowRealm(channel){
231
232 console.log("Emptying the shadowrealm")
233
234 // connecting and defining db
235 let db = new sqlite3.Database('./shadowRealmDB.db', (err) => {
236 if (err) {
237 console.error(err.message);
238 }
239 console.log('Connected to the database.');
240 });
241
242 // sql code
243 db.run(`DELETE FROM usersInTheRealm`, function(err) {
244 if (err) {
245 return console.log(err.message);
246 }
247 client.say(channel, `the shadowrealm is empty`);
248 console.log(`${this.changes}`);
249
250 });
251
252 // closing db connection
253 db.close((err) => {
254 if (err) {
255 return console.error(err.message);
256 }
257 });
258}