@k4la/library 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1208 @@
1
+ /**
2
+ * @file lib/utils/werewolf.js
3
+ * @description Utility functions for managing Werewolf game logic
4
+ * @author K4lameety
5
+ */
6
+
7
+ let toMs = require("ms")
8
+ let jimp = require("jimp")
9
+
10
+ let thumb1 = "https://user-images.githubusercontent.com/72728486/235344562-4677d2ad-48ee-419d-883f-e0ca9ba1c7b8.jpg"
11
+ let thumb2 = "https://user-images.githubusercontent.com/72728486/235344861-acdba7d1-8fce-41b8-adf6-337c818cda2b.jpg"
12
+ let thumb3 = "https://user-images.githubusercontent.com/72728486/235316834-f9f84ba0-8df3-4444-81d8-db5270995e6d.jpg"
13
+ let thumb4 = "https://user-images.githubusercontent.com/72728486/235354619-6ad1cabd-216c-4c7c-b7c2-3a564836653a.jpg"
14
+ let thumb5 = "https://user-images.githubusercontent.com/72728486/235365156-cfab66ce-38b2-4bc7-90d7-7756fc320e06.jpg"
15
+ let thumb6 = "https://user-images.githubusercontent.com/72728486/235365148-35b8def7-c1a2-451d-a2f2-6b6a911b37db.jpg"
16
+
17
+ const resize = async (image, width, height) => {
18
+ const read = await jimp.read(image)
19
+ const data = await read.resize(width, height).getBufferAsync(jimp.MIME_JPEG)
20
+ return data
21
+ }
22
+
23
+ var a
24
+ var b
25
+ var d
26
+ var e
27
+ var f
28
+ var textnya
29
+ var idd
30
+ var room
31
+
32
+ async function sleep(ms) {
33
+ return new Promise((resolve) => setTimeout(resolve, ms))
34
+ }
35
+
36
+ function emoji_role(role) {
37
+ if (role === "warga") {
38
+ return ""
39
+ } else if (role === "seer") {
40
+ return ""
41
+ } else if (role === "guardian") {
42
+ return ""
43
+ } else if (role === "sorcerer") {
44
+ return ""
45
+ } else if (role === "werewolf") {
46
+ return ""
47
+ } else {
48
+ return ""
49
+ }
50
+ }
51
+
52
+ const findObject = (obj = {}, key, value) => {
53
+ const result = []
54
+ const recursiveSearch = (obj = {}) => {
55
+ if (!obj || typeof obj !== "object") {
56
+ return
57
+ }
58
+ if (obj[key] === value) {
59
+ result.push(obj)
60
+ }
61
+ Object.keys(obj).forEach(function(k) {
62
+ recursiveSearch(obj[k])
63
+ })
64
+ }
65
+ recursiveSearch(obj)
66
+ return result
67
+ }
68
+
69
+ const sesi = (from, data) => {
70
+ if (!data[from]) return false
71
+ return data[from]
72
+ }
73
+
74
+ const playerOnGame = (sender, data) => {
75
+ let result = findObject(data, "id", sender)
76
+ let index = false
77
+ if (result.length === 0) {
78
+ return index
79
+ } else {
80
+ index = true
81
+ }
82
+ return index
83
+ }
84
+
85
+ const playerOnRoom = (sender, from, data) => {
86
+ let result = findObject(data, "id", sender)
87
+ let index = false
88
+ if (result.length > 0 && result[0].sesi === from) {
89
+ index = true
90
+ } else {
91
+ return index
92
+ }
93
+ return index
94
+ }
95
+
96
+ const dataPlayer = (sender, data) => {
97
+ let result = findObject(data, "id", sender)
98
+ let index = false
99
+ if (result.length > 0 && result[0].id === sender) {
100
+ index = result[0]
101
+ } else {
102
+ return index
103
+ }
104
+ return index
105
+ }
106
+
107
+ const dataPlayerById = (id, data) => {
108
+ let result = findObject(data, "number", id)
109
+ let index = false
110
+ if (result.length > 0 && result[0].number === id) {
111
+ index = result[0]
112
+ } else {
113
+ return index
114
+ }
115
+ return index
116
+ }
117
+
118
+ const playerExit = (from, id, data) => {
119
+ room = sesi(from, data)
120
+ if (!room) return false
121
+ const indexPlayer = room.player.findIndex((i) => i.id === id)
122
+ room.player.splice(indexPlayer, 1)
123
+ }
124
+
125
+ const getPlayerById = (from, sender, id, data) => {
126
+ room = sesi(from, data)
127
+ if (!room) return false
128
+ const indexPlayer = room.player.findIndex((i) => i.number === id)
129
+ if (indexPlayer === -1) return false
130
+ return {
131
+ index: indexPlayer,
132
+ sesi: room.player[indexPlayer].sesi,
133
+ db: room.player[indexPlayer],
134
+ }
135
+ }
136
+
137
+ const getPlayerById2 = (sender, id, data) => {
138
+ let result = findObject(data, "id", sender)
139
+ if (result.length > 0 && result[0].id === sender) {
140
+ let from = result[0].sesi
141
+ room = sesi(from, data)
142
+ if (!room) return false
143
+ const indexPlayer = room.player.findIndex((i) => i.number === id)
144
+ if (indexPlayer === -1) return false
145
+ return {
146
+ index: indexPlayer,
147
+ sesi: room.player[indexPlayer].sesi,
148
+ db: room.player[indexPlayer],
149
+ }
150
+ }
151
+ }
152
+
153
+ const killWerewolf = (sender, id, data) => {
154
+ let result = getPlayerById2(sender, id, data)
155
+ if (!result) return false
156
+ let {
157
+ index,
158
+ sesi,
159
+ db
160
+ } = result
161
+ if (data[sesi].player[index].number === id) {
162
+ if (db.effect.includes("guardian")) {
163
+ data[sesi].guardian.push(parseInt(id))
164
+ data[sesi].dead.push(parseInt(id))
165
+ } else if (!db.effect.includes("guardian")) {
166
+ data[sesi].dead.push(parseInt(id))
167
+ }
168
+ }
169
+ }
170
+
171
+ const dreamySeer = (sender, id, data) => {
172
+ let result = getPlayerById2(sender, id, data)
173
+ if (!result) return false
174
+ let {
175
+ index,
176
+ sesi,
177
+ db
178
+ } = result
179
+ if (data[sesi].player[index].role === "werewolf") {
180
+ data[sesi].seer = true
181
+ }
182
+ return data[sesi].player[index].role
183
+ }
184
+
185
+ const sorcerer = (sender, id, data) => {
186
+ let result = getPlayerById2(sender, id, data)
187
+ if (!result) return false
188
+ let {
189
+ index,
190
+ sesi,
191
+ db
192
+ } = result
193
+ return data[sesi].player[index].role
194
+ }
195
+
196
+ const protectGuardian = (sender, id, data) => {
197
+ let result = getPlayerById2(sender, id, data)
198
+ if (!result) return false
199
+ let {
200
+ index,
201
+ sesi,
202
+ db
203
+ } = result
204
+ data[sesi].player[index].effect.push("guardian")
205
+ }
206
+
207
+ const roleShuffle = (array) => {
208
+ let currentIndex = array.length,
209
+ randomIndex
210
+ while (currentIndex != 0) {
211
+ randomIndex = Math.floor(Math.random() * currentIndex)
212
+ currentIndex--
213
+ [array[currentIndex], array[randomIndex]] = [
214
+ array[randomIndex],
215
+ array[currentIndex],
216
+ ]
217
+ }
218
+ return array
219
+ }
220
+
221
+ const roleChanger = (from, id, role, data) => {
222
+ room = sesi(from, data)
223
+ if (!room) return false
224
+ var index = room.player.findIndex((i) => i.id === id)
225
+ if (index === -1) return false
226
+ room.player[index].role = role
227
+ }
228
+
229
+ const roleAmount = (from, data) => {
230
+ const result = sesi(from, data)
231
+ if (!result) return false
232
+ if (result.player.length == 4) {
233
+ return {
234
+ werewolf: 1,
235
+ seer: 1,
236
+ guardian: 1,
237
+ warga: 1,
238
+ sorcere: 0,
239
+ }
240
+ } else if (result.player.length == 5) {
241
+ return {
242
+ werewolf: 1,
243
+ seer: 1,
244
+ guardian: 1,
245
+ warga: 3,
246
+ sorcere: 0,
247
+ }
248
+ } else if (result.player.length == 6) {
249
+ return {
250
+ werewolf: 2,
251
+ seer: 1,
252
+ guardian: 1,
253
+ warga: 2,
254
+ sorcere: 0,
255
+ }
256
+ } else if (result.player.length == 7) {
257
+ return {
258
+ werewolf: 2,
259
+ seer: 1,
260
+ guardian: 1,
261
+ warga: 3,
262
+ sorcere: 0,
263
+ }
264
+ } else if (result.player.length == 8) {
265
+ return {
266
+ werewolf: 2,
267
+ seer: 1,
268
+ guardian: 1,
269
+ warga: 4,
270
+ sorcere: 0,
271
+ }
272
+ } else if (result.player.length == 9) {
273
+ return {
274
+ werewolf: 2,
275
+ seer: 1,
276
+ guardian: 1,
277
+ warga: 4,
278
+ sorcere: 1,
279
+ }
280
+ } else if (result.player.length == 10) {
281
+ return {
282
+ werewolf: 2,
283
+ seer: 1,
284
+ guardian: 1,
285
+ warga: 5,
286
+ sorcere: 1,
287
+ }
288
+ } else if (result.player.length == 11) {
289
+ return {
290
+ werewolf: 2,
291
+ seer: 1,
292
+ guardian: 2,
293
+ warga: 5,
294
+ sorcere: 1,
295
+ }
296
+ } else if (result.player.length == 12) {
297
+ return {
298
+ werewolf: 2,
299
+ seer: 1,
300
+ guardian: 2,
301
+ warga: 6,
302
+ sorcere: 1,
303
+ }
304
+ } else if (result.player.length == 13) {
305
+ return {
306
+ werewolf: 2,
307
+ seer: 1,
308
+ guardian: 1,
309
+ warga: 7,
310
+ sorcere: 1,
311
+ }
312
+ } else if (result.player.length == 14) {
313
+ return {
314
+ werewolf: 2,
315
+ seer: 2,
316
+ guardian: 2,
317
+ warga: 7,
318
+ sorcere: 1,
319
+ }
320
+ } else if (result.player.length == 15) {
321
+ return {
322
+ werewolf: 3,
323
+ seer: 2,
324
+ guardian: 3,
325
+ warga: 6,
326
+ sorcere: 1,
327
+ }
328
+ }
329
+ }
330
+
331
+ const roleGenerator = (from, data) => {
332
+ room = sesi(from, data)
333
+ if (!room) return false
334
+ var role = roleAmount(from, data)
335
+ for (var i = 0; i < role.werewolf; i++) {
336
+ var player = room.player.filter((x) => x.role === false)
337
+ var list = roleShuffle(player)
338
+ if (list.length === 0) return false
339
+ var random = Math.floor(Math.random() * list.length)
340
+ roleChanger(from, list[random].id, "werewolf", data)
341
+ }
342
+ for (var i = 0; i < role.seer; i++) {
343
+ var player = room.player.filter((x) => x.role === false)
344
+ var list = roleShuffle(player)
345
+ if (list.length === 0) return false
346
+ var random = Math.floor(Math.random() * list.length)
347
+ roleChanger(from, list[random].id, "seer", data)
348
+ }
349
+ for (var i = 0; i < role.guardian; i++) {
350
+ var player = room.player.filter((x) => x.role === false)
351
+ var list = roleShuffle(player)
352
+ if (list.length === 0) return false
353
+ var random = Math.floor(Math.random() * list.length)
354
+ roleChanger(from, list[random].id, "guardian", data)
355
+ }
356
+ for (var i = 0; i < role.warga; i++) {
357
+ var player = room.player.filter((x) => x.role === false)
358
+ var list = roleShuffle(player)
359
+ if (list.length === 0) return false
360
+ var random = Math.floor(Math.random() * list.length)
361
+ roleChanger(from, list[random].id, "warga", data)
362
+ }
363
+ for (var i = 0; i < role.sorcere; i++) {
364
+ var player = room.player.filter((x) => x.role === false)
365
+ var list = roleShuffle(player)
366
+ if (list.length === 0) return false
367
+ var random = Math.floor(Math.random() * list.length)
368
+ roleChanger(from, list[random].id, "sorcerer", data)
369
+ }
370
+ shortPlayer(from, data)
371
+ }
372
+
373
+ const addTimer = (from, data) => {
374
+ room = sesi(from, data)
375
+ if (!room) return false
376
+ room.cooldown = Date.now() + toMs(90 + "s")
377
+ }
378
+
379
+ const startGame = (from, data) => {
380
+ room = sesi(from, data)
381
+ if (!room) return false
382
+ room.status = true
383
+ }
384
+
385
+ const changeDay = (from, data) => {
386
+ room = sesi(from, data)
387
+ if (!room) return false
388
+ if (room.time === "pagi") {
389
+ room.time = "voting"
390
+ } else if (room.time === "malem") {
391
+ room.time = "pagi"
392
+ room.day += 1
393
+ } else if (room.time === "voting") {
394
+ room.time = "malem"
395
+ }
396
+ }
397
+
398
+ const dayVoting = (from, data) => {
399
+ room = sesi(from, data)
400
+ if (!room) return false
401
+ if (room.time === "malem") {
402
+ room.time = "voting"
403
+ } else if (room.time === "pagi") {
404
+ room.time = "voting"
405
+ }
406
+ }
407
+
408
+ const vote = (from, id, sender, data) => {
409
+ room = sesi(from, data)
410
+ if (!room) return false
411
+ const idGet = room.player.findIndex((i) => i.id === sender)
412
+ if (idGet === -1) return false
413
+ const indexPlayer = room.player.findIndex((i) => i.number === id)
414
+ if (indexPlayer === -1) return false
415
+ if (idGet !== -1) {
416
+ room.player[idGet].isvote = true
417
+ }
418
+ room.player[indexPlayer].vote += 1
419
+ }
420
+
421
+ const voteResult = (from, data) => {
422
+ room = sesi(from, data)
423
+ if (!room) return false
424
+ room.player.sort((a, b) => (a.vote < b.vote ? 1 : -1))
425
+ if (room.player[0].vote === 0) return 0
426
+ if (room.player[0].vote === room.player[1].vote) return 1
427
+ return room.player[0]
428
+ }
429
+
430
+ const voteKill = (from, data) => {
431
+ room = sesi(from, data)
432
+ if (!room) return false
433
+ room.player.sort((a, b) => (a.vote < b.vote ? 1 : -1))
434
+ if (room.player[0].vote === 0) return 0
435
+ if (room.player[0].vote === room.player[1].vote) return 1
436
+ room.player[0].isdead = true
437
+ }
438
+
439
+ const resetVote = (from, data) => {
440
+ room = sesi(from, data)
441
+ if (!room) return false
442
+ for (let i = 0; i < room.player.length; i++) {
443
+ room.player[i].vote = 0
444
+ }
445
+ }
446
+
447
+ const voteDone = (from, data) => {
448
+ room = sesi(from, data)
449
+ if (!room) return false
450
+ room.voting = false
451
+ }
452
+
453
+ const voteStart = (from, data) => {
454
+ room = sesi(from, data)
455
+ if (!room) return false
456
+ room.voting = true
457
+ }
458
+
459
+ const clearAllVote = (from, data) => {
460
+ room = sesi(from, data)
461
+ if (!room) return false
462
+ for (let i = 0; i < room.player.length; i++) {
463
+ room.player[i].vote = 0
464
+ room.player[i].isvote = false
465
+ }
466
+ }
467
+
468
+ const clearAll = (from, data) => {
469
+ room = sesi(from, data)
470
+ if (!room) return false
471
+ room.dead = []
472
+ room.seer = false
473
+ room.guardian = []
474
+ room.voting = false
475
+ }
476
+
477
+ const clearAllSTATUS = (from, data) => {
478
+ room = sesi(from, data)
479
+ if (!room) return false
480
+ for (let i = 0; i < room.player.length; i++) {
481
+ room.player[i].effect = []
482
+ }
483
+ }
484
+
485
+ const skillOn = (from, data) => {
486
+ room = sesi(from, data)
487
+ if (!room) return false
488
+ for (let i = 0; i < room.player.length; i++) {
489
+ room.player[i].status = false
490
+ }
491
+ }
492
+
493
+ const skillOff = (from, data) => {
494
+ room = sesi(from, data)
495
+ if (!room) return false
496
+ for (let i = 0; i < room.player.length; i++) {
497
+ room.player[i].status = true
498
+ }
499
+ }
500
+
501
+ const playerHidup = (data) => {
502
+ const hasil = data.player.filter((x) => x.isdead === false)
503
+ return hasil.length
504
+ }
505
+
506
+ const playerMati = (data) => {
507
+ const hasil = data.player.filter((x) => x.isdead === true)
508
+ return hasil.length
509
+ }
510
+
511
+ const getWinner = (from, data) => {
512
+ room = sesi(from, data)
513
+ if (!room) return false
514
+ var ww = 0
515
+ var orang_baek = 0
516
+ for (let i = 0; i < room.player.length; i++) {
517
+ if (room.player[i].isdead === false) {
518
+ if (
519
+ room.player[i].role === "werewolf" ||
520
+ room.player[i].role === "sorcerer"
521
+ ) {
522
+ ww += 1
523
+ } else if (
524
+ room.player[i].role === "warga" ||
525
+ room.player[i].role === "guardian" ||
526
+ room.player[i].role === "seer"
527
+ ) {
528
+ orang_baek += 1
529
+ }
530
+ }
531
+ }
532
+ if (room.voting) {
533
+ b = voteResult(from, data)
534
+ if (b != 0 && b != 1) {
535
+ if (b.role === "werewolf" || b.role === "sorcerer") {
536
+ ww -= 1
537
+ } else if (
538
+ b.role === "warga" ||
539
+ b.role === "seer" ||
540
+ b.role === "guardian"
541
+ ) {
542
+ orang_baek -= 1
543
+ }
544
+ }
545
+ }
546
+ if (ww === 0) {
547
+ room.iswin = true
548
+ return {
549
+ voting: room.voting,
550
+ status: true
551
+ }
552
+ } else if (ww === orang_baek) {
553
+ room.iswin = false
554
+ return {
555
+ voting: room.voting,
556
+ status: false
557
+ }
558
+ } else if (orang_baek === 0) {
559
+ room.iswin = false
560
+ return {
561
+ voting: room.voting,
562
+ status: false
563
+ }
564
+ } else {
565
+ return {
566
+ voting: room.voting,
567
+ status: null
568
+ }
569
+ }
570
+ }
571
+
572
+ const shortPlayer = (from, data) => {
573
+ room = sesi(from, data)
574
+ if (!room) return false
575
+ room.player.sort((a, b) => a.number - b.number)
576
+ }
577
+
578
+ const killww = (from, id, data) => {
579
+ room = sesi(from, data)
580
+ if (!room) return false
581
+ for (let j = 0; j < room.dead.length; j++) {
582
+ idd = getPlayerById(from, room.player[0].id, room.dead[j], data)
583
+ if (!idd) return false
584
+ if (room.player[idd.index].effect.includes("guardian")) return
585
+ room.player[idd.index].isdead = true
586
+ }
587
+ }
588
+
589
+ const pagii = (data) => {
590
+ if (data.dead.length < 1) {
591
+ return `W E R E W O L F - G A M E\n\nThe sun has risen, there are no casualties tonight, villagers return to their activities as usual.\n90 seconds remain before decision time, villagers are welcome to discuss\nDay ${data.day}`
592
+ } else {
593
+ a = ""
594
+ d = ""
595
+ e = []
596
+ f = []
597
+ for (let i = 0; i < data.dead.length; i++) {
598
+ b = data.player.findIndex((x) => x.number === data.dead[i])
599
+ if (data.player[b].effect.includes("guardian")) {
600
+ e.push(data.player[b].id)
601
+ } else {
602
+ f.push(data.player[b].id)
603
+ }
604
+ }
605
+ for (let i = 0; i < f.length; i++) {
606
+ if (i === f.length - 1) {
607
+ if (f.length > 1) {
608
+ a += ` and @${f[i].replace("@s.whatsapp.net", "")}`
609
+ } else {
610
+ a += `@${f[i].replace("@s.whatsapp.net", "")}`
611
+ }
612
+ } else if (i === f.length - 2) {
613
+ a += `@${f[i].replace("@s.whatsapp.net", "")}`
614
+ } else {
615
+ a += `@${f[i].replace("@s.whatsapp.net", "")}, `
616
+ }
617
+ }
618
+ for (let i = 0; i < e.length; i++) {
619
+ if (i === e.length - 1) {
620
+ if (e.length > 1) {
621
+ d += ` and @${e[i].replace("@s.whatsapp.net", "")}`
622
+ } else {
623
+ d += `@${e[i].replace("@s.whatsapp.net", "")}`
624
+ }
625
+ } else if (i === e.length - 2) {
626
+ d += `@${e[i].replace("@s.whatsapp.net", "")}`
627
+ } else {
628
+ d += `@${e[i].replace("@s.whatsapp.net", "")}, `
629
+ }
630
+ }
631
+ textnya = `W E R E W O L F - G A M E\n\nMorning has arrived, villagers found ${
632
+ data.dead.length > 1 ? "some" : "1"
633
+ } bodies in piles of rubble and scattered blood. ${a ? a + " has died! " : ""}${
634
+ d.length > 1
635
+ ? ` ${d} was almost killed, but the Guardian Angel managed to protect them.`
636
+ : ""
637
+ }\n\nSuddenly it is noon, the sun is directly overhead, the scorching heat makes the atmosphere chaotic, villagers have 90 seconds to discuss\nDay ${
638
+ data.day
639
+ }`
640
+ return textnya
641
+ }
642
+ }
643
+
644
+ async function pagi(Kyzo, x, data) {
645
+ skillOff(x.room, data)
646
+ let ment = []
647
+ for (let i = 0; i < x.player.length; i++) {
648
+ ment.push(x.player[i].id)
649
+ }
650
+ shortPlayer(x.room, data)
651
+ killww(x.room, x.dead, data)
652
+ shortPlayer(x.room, data)
653
+ changeDay(x.room, data)
654
+ return await Kyzo.sendMessage(x.room, {
655
+ text: pagii(x),
656
+ contextInfo: {
657
+ externalAdReply: {
658
+ title: "W E R E W O L F",
659
+ mediaType: 1,
660
+ renderLargerThumbnail: true,
661
+ thumbnail: await resize(thumb1, 300, 175),
662
+ sourceUrl: "",
663
+ mediaUrl: thumb1,
664
+ },
665
+ mentionedJid: ment,
666
+ },
667
+ })
668
+ }
669
+
670
+ async function voting(Kyzo, x, data) {
671
+ let row = []
672
+ let ment = []
673
+ voteStart(x.room, data)
674
+ textnya =
675
+ "W E R E W O L F - G A M E\n\nTwilight has arrived. All villagers gather at the village hall to choose who will be executed. Some villagers look busy preparing torture tools for tonight. You have 90 seconds to choose! Be careful, there is a traitor among you!\n\nL I S T - P L A Y E R:\n"
676
+ shortPlayer(x.room, data)
677
+ for (let i = 0; i < x.player.length; i++) {
678
+ textnya += `(${x.player[i].number}) @${x.player[i].id.replace(
679
+ "@s.whatsapp.net",
680
+ ""
681
+ )} ${x.player[i].isdead === true ? "" : ""}\n`
682
+ ment.push(x.player[i].id)
683
+ }
684
+ textnya += "\ntype .ww vote number to vote player"
685
+ dayVoting(x.room, data)
686
+ clearAll(x.room, data)
687
+ clearAllSTATUS(x.room, data)
688
+ return await Kyzo.sendMessage(x.room, {
689
+ text: textnya,
690
+ contextInfo: {
691
+ externalAdReply: {
692
+ title: "W E R E W O L F",
693
+ mediaType: 1,
694
+ renderLargerThumbnail: true,
695
+ thumbnail: await resize(thumb2, 300, 175),
696
+ sourceUrl: "",
697
+ mediaUrl: thumb2,
698
+ },
699
+ mentionedJid: ment,
700
+ },
701
+ })
702
+ }
703
+
704
+ async function malam(Kyzo, x, data) {
705
+ var hasil_vote = voteResult(x.room, data)
706
+ if (hasil_vote === 0) {
707
+ textnya = `W E R E W O L F - G A M E\n\nToo hesitant to choose. Villagers returned to their homes, no one was executed today. The moon shines brightly, a gripping night has come. Hopefully no one dies tonight. Night players: you have 90 seconds to act!`
708
+ return Kyzo
709
+ .sendMessage(x.room, {
710
+ text: textnya,
711
+ contextInfo: {
712
+ externalAdReply: {
713
+ title: "W E R E W O L F",
714
+ mediaType: 1,
715
+ renderLargerThumbnail: true,
716
+ thumbnail: await resize(thumb3, 300, 175),
717
+ sourceUrl: "",
718
+ mediaUrl: thumb3,
719
+ },
720
+ },
721
+ })
722
+ .then(() => {
723
+ changeDay(x.room, data)
724
+ voteDone(x.room, data)
725
+ resetVote(x.room, data)
726
+ clearAllVote(x.room, data)
727
+ if (getWinner(x.room, data).status != null)
728
+ return win(x, 1, Kyzo, data)
729
+ })
730
+ } else if (hasil_vote === 1) {
731
+ textnya = `W E R E W O L F - G A M E\n\nThe villagers have voted, but the result is a tie.\n\nThe stars shine beautifully tonight, villagers rest in their respective residences. Night players: you have 90 seconds to act!`
732
+ return Kyzo
733
+ .sendMessage(x.room, {
734
+ text: textnya,
735
+ contextInfo: {
736
+ externalAdReply: {
737
+ title: "W E R E W O L F",
738
+ mediaType: 1,
739
+ renderLargerThumbnail: true,
740
+ thumbnail: await resize(thumb3, 300, 175),
741
+ sourceUrl: "",
742
+ mediaUrl: thumb3,
743
+ },
744
+ },
745
+ })
746
+ .then(() => {
747
+ changeDay(x.room, data)
748
+ voteDone(x.room, data)
749
+ resetVote(x.room, data)
750
+ clearAllVote(x.room, data)
751
+ if (getWinner(x.room, data).status != null)
752
+ return win(x, 1, Kyzo, data)
753
+ })
754
+ } else if (hasil_vote != 0 && hasil_vote != 1) {
755
+ if (hasil_vote.role === "werewolf") {
756
+ textnya = `W E R E W O L F - G A M E\n\nVillagers have chosen and agreed @${hasil_vote.id.replace(
757
+ "@s.whatsapp.net",
758
+ ""
759
+ )} to be executed.\n\n@${hasil_vote.id.replace(
760
+ "@s.whatsapp.net",
761
+ ""
762
+ )} was a ${hasil_vote.role} ${emoji_role(hasil_vote.role)}`
763
+ voteKill(x.room, data)
764
+ let ment = []
765
+ ment.push(hasil_vote.id)
766
+ return await Kyzo
767
+ .sendMessage(x.room, {
768
+ text: textnya,
769
+ contextInfo: {
770
+ externalAdReply: {
771
+ title: "W E R E W O L F",
772
+ mediaType: 1,
773
+ renderLargerThumbnail: true,
774
+ thumbnail: await resize(thumb4, 300, 175),
775
+ sourceUrl: "",
776
+ mediaUrl: thumb4,
777
+ },
778
+ mentionedJid: ment,
779
+ },
780
+ })
781
+ .then(() => {
782
+ changeDay(x.room, data)
783
+ voteDone(x.room, data)
784
+ resetVote(x.room, data)
785
+ clearAllVote(x.room, data)
786
+ if (getWinner(x.room, data).status != null)
787
+ return win(x, 1, Kyzo, data)
788
+ })
789
+ } else {
790
+ textnya = `W E R E W O L F - G A M E\n\nVillagers have chosen and agreed @${hasil_vote.id.replace(
791
+ "@s.whatsapp.net",
792
+ ""
793
+ )} to be executed.\n\n@${hasil_vote.id.replace(
794
+ "@s.whatsapp.net",
795
+ ""
796
+ )} was a ${hasil_vote.role} ${emoji_role(
797
+ hasil_vote.role
798
+ )}\n\nThe moon shines brightly tonight, villagers rest in their respective residences. Night players: you have 90 seconds to act!`
799
+ voteKill(x.room, data)
800
+ let ment = []
801
+ ment.push(hasil_vote.id)
802
+ return await Kyzo
803
+ .sendMessage(x.room, {
804
+ text: textnya,
805
+ contextInfo: {
806
+ externalAdReply: {
807
+ title: "W E R E W O L F",
808
+ mediaType: 1,
809
+ renderLargerThumbnail: true,
810
+ thumbnail: await resize(thumb4, 300, 175),
811
+ sourceUrl: "",
812
+ mediaUrl: thumb4,
813
+ },
814
+ mentionedJid: ment,
815
+ },
816
+ })
817
+ .then(() => {
818
+ changeDay(x.room, data)
819
+ voteDone(x.room, data)
820
+ resetVote(x.room, data)
821
+ clearAllVote(x.room, data)
822
+ if (getWinner(x.room, data).status != null)
823
+ return win(x, 1, Kyzo, data)
824
+ })
825
+ }
826
+ }
827
+ }
828
+
829
+ async function skill(Kyzo, x, data) {
830
+ skillOn(x.room, data)
831
+ if (getWinner(x.room, data).status != null || x.win != null) {
832
+ return win(x, 1, Kyzo, data)
833
+ } else {
834
+ if (!x) return
835
+ if (!x.player) return
836
+ if (x.win != null) return
837
+ let tok1 = "\n"
838
+ let tok2 = "\n"
839
+ let membernya = []
840
+ shortPlayer(x.room, data)
841
+ for (let i = 0; i < x.player.length; i++) {
842
+ tok1 += `(${x.player[i].number}) @${x.player[i].id.replace(
843
+ "@s.whatsapp.net",
844
+ ""
845
+ )}${x.player[i].isdead === true ? " " : ""}\n`
846
+ membernya.push(x.player[i].id)
847
+ }
848
+ for (let i = 0; i < x.player.length; i++) {
849
+ tok2 += `(${x.player[i].number}) @${x.player[i].id.replace(
850
+ "@s.whatsapp.net",
851
+ ""
852
+ )} ${
853
+ x.player[i].role === "werewolf" || x.player[i].role === "sorcerer"
854
+ ? `${x.player[i].isdead === true ? ` ` : ` ${x.player[i].role}`}`
855
+ : " "
856
+ }\n`
857
+ membernya.push(x.player[i].id)
858
+ }
859
+ for (let i = 0; i < x.player.length; i++) {
860
+ if (x.player[i].role === "werewolf") {
861
+ if (x.player[i].isdead != true) {
862
+ textnya = `Please choose one person to eat tonight\nLIST PLAYER:\n${tok2}\n\nType .wwpc kill number to kill player`
863
+
864
+ await Kyzo.sendMessage(x.player[i].id, {
865
+ text: textnya,
866
+ mentions: membernya,
867
+ })
868
+ }
869
+ } else if (x.player[i].role === "warga") {
870
+ if (x.player[i].isdead != true) {
871
+ textnya = `W E R E W O L F - G A M E\n\nAs a villager be careful, you might be the next target.\nLIST PLAYER:${tok1}`
872
+ await Kyzo.sendMessage(x.player[i].id, {
873
+ text: textnya,
874
+ mentions: membernya,
875
+ })
876
+ }
877
+ } else if (x.player[i].role === "seer") {
878
+ if (x.player[i].isdead != true) {
879
+ textnya = `Alright, who do you want to see the role of this time.\nLIST PLAYER:${tok1}\n\nType .wwpc dreamy number to see player role`
880
+
881
+ await Kyzo.sendMessage(x.player[i].id, {
882
+ text: textnya,
883
+ mentions: membernya,
884
+ })
885
+ }
886
+ } else if (x.player[i].role === "guardian") {
887
+ if (x.player[i].isdead != true) {
888
+ textnya = `You are a Guardian, protect the villagers, please choose 1 player you want to protect\nLIST PLAYER:${tok1}\n\nType .wwpc deff number to protect player`
889
+
890
+ await Kyzo.sendMessage(x.player[i].id, {
891
+ text: textnya,
892
+ mentions: membernya,
893
+ })
894
+ }
895
+ } else if (x.player[i].role === "sorcerer") {
896
+ if (x.player[i].isdead != true) {
897
+ textnya = `Alright, see what you can do, please choose 1 person you want to reveal identity\nLIST PLAYER:${tok2}\n\nType .wwpc sorcerer number to see player role`
898
+
899
+ await Kyzo.sendMessage(x.player[i].id, {
900
+ text: textnya,
901
+ mentions: membernya,
902
+ })
903
+ }
904
+ }
905
+ }
906
+ }
907
+ }
908
+
909
+ async function win(x, t, Kyzo, data) {
910
+ const sesinya = x.room
911
+ if (getWinner(x.room, data).status === false || x.iswin === false) {
912
+ textnya = `W E R E W O L F - W I N\n\nTEAM WEREWOLF\n\n`
913
+ let ment = []
914
+ for (let i = 0; i < x.player.length; i++) {
915
+ if (x.player[i].role === "sorcerer" || x.player[i].role === "werewolf") {
916
+ textnya += `${x.player[i].number}) @${x.player[i].id.replace(
917
+ "@s.whatsapp.net",
918
+ ""
919
+ )}\n Role : ${x.player[i].role}\n\n`
920
+ ment.push(x.player[i].id)
921
+ }
922
+ }
923
+ return await Kyzo
924
+ .sendMessage(sesinya, {
925
+ text: textnya,
926
+ contextInfo: {
927
+ externalAdReply: {
928
+ title: "W E R E W O L F",
929
+ mediaType: 1,
930
+ renderLargerThumbnail: true,
931
+ thumbnail: await resize(thumb5, 300, 175),
932
+ sourceUrl: "",
933
+ mediaUrl: thumb5,
934
+ },
935
+ mentionedJid: ment,
936
+ },
937
+ })
938
+ .then(() => {
939
+ delete data[x.room]
940
+ })
941
+ } else if (getWinner(x.room, data).status === true) {
942
+ textnya = `V I L L A G E R - T E A M - W I N\n\nTEAM VILLAGER\n\n`
943
+ let ment = []
944
+ for (let i = 0; i < x.player.length; i++) {
945
+ if (
946
+ x.player[i].role === "warga" ||
947
+ x.player[i].role === "guardian" ||
948
+ x.player[i].role === "seer"
949
+ ) {
950
+ textnya += `${x.player[i].number}) @${x.player[i].id.replace(
951
+ "@s.whatsapp.net",
952
+ ""
953
+ )}\n Role : ${x.player[i].role}\n\n`
954
+ ment.push(x.player[i].id)
955
+ }
956
+ }
957
+ return await Kyzo.sendMessage(sesinya, {
958
+ text: textnya,
959
+ contextInfo: {
960
+ externalAdReply: {
961
+ title: "W E R E W O L F",
962
+ mediaType: 1,
963
+ renderLargerThumbnail: true,
964
+ thumbnail: await resize(thumb6, 300, 175),
965
+ sourceUrl: "",
966
+ mediaUrl: thumb5,
967
+ },
968
+ mentionedJid: ment,
969
+ },
970
+ })
971
+ }
972
+ }
973
+
974
+ async function run(Kyzo, id, data) {
975
+ while (getWinner(id, data).status === null) {
976
+ if (getWinner(id, data).status != null) {
977
+ win(getWinner(id, data), 1, Kyzo, data)
978
+ break
979
+ } else {
980
+ await sleep(90000)
981
+ }
982
+ if (getWinner(id, data).status != null) {
983
+ win(getWinner(id, data), 1, Kyzo, data)
984
+ break
985
+ } else {
986
+ await pagi(Kyzo, sesi(id, data), data)
987
+ }
988
+ if (getWinner(id, data).status != null) {
989
+ win(getWinner(id, data), 1, Kyzo, data)
990
+ break
991
+ } else {
992
+ await sleep(90000)
993
+ }
994
+ if (getWinner(id, data).status != null) {
995
+ win(getWinner(id, data), 1, Kyzo, data)
996
+ break
997
+ } else {
998
+ await voting(Kyzo, sesi(id, data), data)
999
+ }
1000
+ if (getWinner(id, data).status != null) {
1001
+ win(getWinner(id, data), 1, Kyzo, data)
1002
+ break
1003
+ } else {
1004
+ await sleep(90000)
1005
+ }
1006
+ if (getWinner(id, data).status != null) {
1007
+ win(getWinner(id, data), 1, Kyzo, data)
1008
+ break
1009
+ } else {
1010
+ await malam(Kyzo, sesi(id, data), data)
1011
+ }
1012
+ if (getWinner(id, data).status != null) {
1013
+ win(getWinner(id, data), 1, Kyzo, data)
1014
+ break
1015
+ } else {
1016
+ await skill(Kyzo, sesi(id, data), data)
1017
+ }
1018
+ if (getWinner(id, data).status != null) break
1019
+ }
1020
+ await win(sesi(id, data), 1, Kyzo, data)
1021
+ }
1022
+
1023
+ async function run_vote(Kyzo, id, data) {
1024
+ while (getWinner(id, data).status === null) {
1025
+ if (getWinner(id, data).status != null) {
1026
+ win(getWinner(id, data), 1, Kyzo, data)
1027
+ break
1028
+ } else {
1029
+ await voting(Kyzo, sesi(id, data), data)
1030
+ }
1031
+ if (getWinner(id, data).status != null) {
1032
+ win(getWinner(id, data), 1, Kyzo, data)
1033
+ break
1034
+ } else {
1035
+ await sleep(90000)
1036
+ }
1037
+ if (getWinner(id, data).status != null) {
1038
+ win(getWinner(id, data), 1, Kyzo, data)
1039
+ break
1040
+ } else {
1041
+ await malam(Kyzo, sesi(id, data), data)
1042
+ }
1043
+ if (getWinner(id, data).status != null) {
1044
+ win(getWinner(id, data), 1, Kyzo, data)
1045
+ break
1046
+ } else {
1047
+ await skill(Kyzo, sesi(id, data), data)
1048
+ }
1049
+ if (getWinner(id, data).status != null) {
1050
+ win(getWinner(id, data), 1, Kyzo, data)
1051
+ break
1052
+ } else {
1053
+ await sleep(90000)
1054
+ }
1055
+ if (getWinner(id, data).status != null) {
1056
+ win(getWinner(id, data), 1, Kyzo, data)
1057
+ break
1058
+ } else {
1059
+ await pagi(Kyzo, sesi(id, data), data)
1060
+ }
1061
+ if (getWinner(id, data).status != null) {
1062
+ win(getWinner(id, data), 1, Kyzo, data)
1063
+ break
1064
+ } else {
1065
+ await sleep(90000)
1066
+ }
1067
+ if (getWinner(id, data).status != null) break
1068
+ }
1069
+ await win(sesi(id, data), 1, Kyzo, data)
1070
+ }
1071
+
1072
+ async function run_malam(Kyzo, id, data) {
1073
+ while (getWinner(id, data).status === null) {
1074
+ if (getWinner(id, data).status != null) {
1075
+ win(getWinner(id, data), 1, Kyzo, data)
1076
+ break
1077
+ } else {
1078
+ await skill(Kyzo, sesi(id, data), data)
1079
+ }
1080
+ if (getWinner(id, data).status != null) {
1081
+ win(getWinner(id, data), 1, Kyzo, data)
1082
+ break
1083
+ } else {
1084
+ await sleep(90000)
1085
+ }
1086
+ if (getWinner(id, data).status != null) {
1087
+ win(getWinner(id, data), 1, Kyzo, data)
1088
+ break
1089
+ } else {
1090
+ await pagi(Kyzo, sesi(id, data), data)
1091
+ }
1092
+ if (getWinner(id, data).status != null) {
1093
+ win(getWinner(id, data), 1, Kyzo, data)
1094
+ break
1095
+ } else {
1096
+ await sleep(90000)
1097
+ }
1098
+ if (getWinner(id, data).status != null) {
1099
+ win(getWinner(id, data), 1, Kyzo, data)
1100
+ break
1101
+ } else {
1102
+ await voting(Kyzo, sesi(id, data), data)
1103
+ }
1104
+ if (getWinner(id, data).status != null) {
1105
+ win(getWinner(id, data), 1, Kyzo, data)
1106
+ break
1107
+ } else {
1108
+ await sleep(90000)
1109
+ }
1110
+ if (getWinner(id, data).status != null) {
1111
+ win(getWinner(id, data), 1, Kyzo, data)
1112
+ break
1113
+ } else {
1114
+ await malam(Kyzo, sesi(id, data), data)
1115
+ }
1116
+ if (getWinner(id, data).status != null) break
1117
+ }
1118
+ await win(sesi(id, data), 1, Kyzo, data)
1119
+ }
1120
+
1121
+ async function run_pagi(Kyzo, id, data) {
1122
+ while (getWinner(id, data).status === null) {
1123
+ if (getWinner(id, data).status != null) {
1124
+ win(getWinner(id, data), 1, Kyzo, data)
1125
+ break
1126
+ } else {
1127
+ await pagi(Kyzo, sesi(id, data), data)
1128
+ }
1129
+ if (getWinner(id, data).status != null) {
1130
+ win(getWinner(id, data), 1, Kyzo, data)
1131
+ break
1132
+ } else {
1133
+ await sleep(90000)
1134
+ }
1135
+ if (getWinner(id, data).status != null) {
1136
+ win(getWinner(id, data), 1, Kyzo, data)
1137
+ break
1138
+ } else {
1139
+ await voting(Kyzo, sesi(id, data), data)
1140
+ }
1141
+ if (getWinner(id, data).status != null) {
1142
+ win(getWinner(id, data), 1, Kyzo, data)
1143
+ break
1144
+ } else {
1145
+ await sleep(90000)
1146
+ }
1147
+ if (getWinner(id, data).status != null) {
1148
+ win(getWinner(id, data), 1, Kyzo, data)
1149
+ break
1150
+ } else {
1151
+ await malam(Kyzo, sesi(id, data), data)
1152
+ }
1153
+ if (getWinner(id, data).status != null) {
1154
+ win(getWinner(id, data), 1, Kyzo, data)
1155
+ break
1156
+ } else {
1157
+ await skill(Kyzo, sesi(id, data), data)
1158
+ }
1159
+ if (getWinner(id, data).status != null) {
1160
+ win(getWinner(id, data), 1, Kyzo, data)
1161
+ break
1162
+ } else {
1163
+ await sleep(90000)
1164
+ }
1165
+ if (getWinner(id, data).status != null) break
1166
+ }
1167
+ await win(sesi(id, data), 1, Kyzo, data)
1168
+ }
1169
+
1170
+ module.exports = {
1171
+ emoji_role,
1172
+ sesi,
1173
+ playerOnGame,
1174
+ playerOnRoom,
1175
+ playerExit,
1176
+ dataPlayer,
1177
+ dataPlayerById,
1178
+ getPlayerById,
1179
+ getPlayerById2,
1180
+ killWerewolf,
1181
+ killww,
1182
+ dreamySeer,
1183
+ sorcerer,
1184
+ protectGuardian,
1185
+ roleShuffle,
1186
+ roleChanger,
1187
+ roleAmount,
1188
+ roleGenerator,
1189
+ addTimer,
1190
+ startGame,
1191
+ playerHidup,
1192
+ playerMati,
1193
+ vote,
1194
+ voteResult,
1195
+ clearAllVote,
1196
+ getWinner,
1197
+ win,
1198
+ pagi,
1199
+ malam,
1200
+ skill,
1201
+ voteStart,
1202
+ voteDone,
1203
+ voting,
1204
+ run,
1205
+ run_vote,
1206
+ run_malam,
1207
+ run_pagi,
1208
+ }