-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquiz.py
349 lines (332 loc) · 14.1 KB
/
quiz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
import os
import re
import sys
import random
import time
import json
from acc import (line_bot_api, qz, handler, owner, namaBot)
from sesuatu import (panggil, film_quiz, pemain, hasil_akhir, skor_akhir, mulai_permainan)
from datetime import datetime
from threading import Timer
from linebot.models import *
soal = {}
playah = {}
kebenaran = {}
selesai = {}
aturan = ["Akan diberikan 10 soal yang harus dijawab dengan durasi kurang dari 1 menit.",
"Minimal ada 5 pemain dalam 1 grup",
"Pemain yang pertama kali menjawab benar akan diberikan 5 poin.",
"Pemain yang menjawab benar diurutan kedua akan diberikan 3 poin.",
"Pemain yang menjawab benar diurutan ketiga akan diberikan 1 poin.",
"Pemain yang menjawab benar tetapi mendapatkan urutan diatas 3 tidak mendapatkan poin.",
"Pemain yang menjawab salah akan dikurangi 1 poin.",
"Pemain yang menyerah tidak akan mendapat ataupun mengurangi poin, tetapi tidak dapat melanjutkan ke soal selanjutnya.",
"Pemain yang tidak menjawab akan dianggap menyerah dan tidak mengikuti soal berikutnya."]
def cek_pemain(ruangan):
if ruangan in playah:
jumlah_pemain = len(playah[ruangan]["pemain"])
if jumlah_pemain < 5:
line_bot_api.push_message(ruangan, TextSendMessage(text='Jumlah pemain kurang, permainan dibatalkan :('))
del playah[ruangan]
def waktu_main(nomor_soal, ruangan):
nomor, tanya, waktu = soal[ruangan]
if nomor == nomor_soal:
for pion in playah[ruangan]["pemain"]:
if not (pion in kebenaran[ruangan]["benar"]) and not (pion in kebenaran[ruangan]["salah"]):
kebenaran[ruangan]["nyerah"].append(pion)
if len(kebenaran[ruangan]["nyerah"]) > 0:
line_bot_api.push_message(ruangan, TextSendMessage(text='Kak '+", ".join([panggil(sender) for sender in kebenaran[ruangan]["nyerah"]])+' menyerah dan tidak dapat mengikuti permainan lagi :('))
@handler.add(PostbackEvent)
def handle_postback(event):
if isinstance(event.source, SourceGroup):
kirim = event.source.sender_id
elif isinstance(event.source, SourceRoom):
kirim = event.source.room_id
else:
kirim = event.source.user_id
sender = event.source.user_id
try:
if event.postback.data[0] == '/':
data = event.postback.data[1:].split(" ",1)
if len(data) > 1:
cmd, args = data[0].lower(), data[1]
else:
cmd, args = data[0].lower(), ""
if cmd == "main":
pesan = TemplateSendMessage(
alt_text='Kamu yakin?',
template=ConfirmTemplate(
text='Kamu akan diberikan beberapa soal yang berhubungan dengan film. Siapkah kamu menjawabnya?',
actions=[
PostbackAction(
label='Siap',
text='Siapp, siapa takut?',
data='/quiz ready'
),
PostbackAction(
label='Tidak',
text='Belum, saya masih gatau apa-apa tentang film T_T',
data='/quiz not ready'
)
]
)
)
line_bot_api.reply_message(event.reply_token, pesan)
elif cmd == 'nyerah':
if kirim in playah:
if sender in playah[kirim]["pemain"]:
if sender in kebenaran[kirim]["nyerah"]:return
if playah[kirim]["status"] == "mulai":
kebenaran[kirim]["nyerah"].append(sender)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' menyerah dan tidak dapat melanjutkan permainan :('))
else:
try:
nomor, tanya, waktu = soal[kirim]
except:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' tidak dalam permainan ._.'))
return
data = qz.child("Quiz").child("Skor Pribadi").child(sender).get().val()
nama = line_bot_api.get_profile(sender).display_name
poin = data["poin"]
try:
gambar = line_bot_api.get_profile(sender).picture_url
except:
gambar = ""
line_bot_api.reply_message(event.reply_token, hasil_akhir(nama, nomor-1, poin, gambar))
del soal[kirim]
del selesai[kirim]
elif cmd == 'quiz':
if args == 'ready':
if event.source.type == 'user':
try:
data = qz.child("Quiz").child("Skor Pribadi").child(sender).get().val()
poin = data["poin"]
except:
data = {"poin":0,"waktu":time.time()}
qz.child("Quiz").child("Skor Pribadi").child(sender).set(data)
pertanyaan = qz.child("Quiz").child("Pilihan").get().val()
tanya = random.choice([i for i in pertanyaan])
pilihan = [i for i in pertanyaan[tanya]["Jawaban"]]
film = pertanyaan[tanya]["Film"]
try:
gambar = pertanyaan[tanya]["Gambar"]
except:
gambar = ""
nomor = 1
soal.update({kirim:[nomor, tanya, time.time()]})
selesai.update({kirim:[]})
selesai[kirim].append(tanya)
line_bot_api.reply_message(event.reply_token, film_quiz("Pertanyaan "+str(nomor)+"/10", tanya, film, pilihan, gambar))
else:
line_bot_api.reply_message(event.reply_token, pemain(aturan))
playah.update({kirim:{"status":"pending","pemain":[]}})
t = Timer(60, cek_pemain, [kirim])
t.start()
else:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kabarin kalau udah siap ya kak ;D'))
elif cmd == 'join':
durasi = time.time() - float(args)
try:
status = playah[kirim]["status"]
except:
line_bot_api.reply_message(event.reply_token, mulai_permainan())
return
if sender in playah[kirim]["pemain"]:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' sudah memasuki permainan ._.'))
return
if status == 'pending':
if durasi < 30*60: #30 menit
playah[kirim]["pemain"].append(sender)
try:
main = qz.child("Quiz").child("Skor").child(kirim).child(sender).get().val()
poin = main["poin"]
except:
data = {"poin":0,"waktu":time.time()}
qz.child("Quiz").child("Skor").child(kirim).child(sender).set(data)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' telah bergabung ;D'))
if len(playah[kirim]["pemain"]) == 5:
line_bot_api.push_message(kirim, [
TextSendMessage(text='5 pemain telah terkumpul ;D'),
TextSendMessage(text='Kalian bisa menunggu atau langsung memulai permainan'),
TextSendMessage(text='Ketik /mulai jika ingin memulai permainan ;)')
]
)
else:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Waktu untuk bergabung sudah habis kak '+panggil(sender)+' :('))
else:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' tidak dapat bergabung karena permainan sedang berlangsung ;)'))
elif cmd == 'jawab':
if kirim in soal:
nomor, tanya, waktu = soal[kirim]
bertanya = qz.child("Quiz").child("Pilihan").get().val()
bertanya = bertanya[tanya]
try:
menjawab = bertanya["Jawaban"][args]
except:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Tidak ada pilihan yang kak '+panggil(sender)+' pilih di soal ini :('))
return
if event.source.type == 'user':
if menjawab == 'Benar':
data = qz.child("Quiz").child("Skor Pribadi").child(sender).get().val()
poin = data["poin"] + 1
qz.child("Quiz").child("Skor Pribadi").child(sender).set({"poin":poin,"waktu":time.time()})
pertanyaan = qz.child("Quiz").child("Pilihan").get().val()
tanya = random.choice([i for i in pertanyaan])
while tanya in selesai[kirim]:
tanya = random.choice([i for i in pertanyaan])
selesai[kirim].append(tanya)
pilihan = [i for i in pertanyaan[tanya]["Jawaban"]]
film = pertanyaan[tanya]["Film"]
try:
gambar = pertanyaan[tanya]["Gambar"]
except:
gambar = ""
if nomor < 10:
nomor = nomor + 1
soal.update({kirim:[nomor, tanya, time.time()]})
line_bot_api.reply_message(event.reply_token, [
TextSendMessage(text='Kak '+panggil(sender)+' benar ;D'),
film_quiz("Pertanyaan "+str(nomor)+"/10", tanya, film, pilihan, gambar)
]
)
else:
data = qz.child("Quiz").child("Skor Pribadi").get().val()
nama = line_bot_api.get_profile(sender).display_name
poin = data[sender]["poin"]
skorlist = {}
for p in data:
skornya = data[p]["poin"]
waktu = data[p]["waktu"]
skorlist.update({p:[skornya, waktu]})
line_bot_api.reply_message(event.reply_token, hasil_akhir(nama, nomor, poin, skorlist))
del soal[kirim]
del selesai[kirim]
else:
data = qz.child("Quiz").child("Skor Pribadi").child(sender).get().val()
nama = line_bot_api.get_profile(sender).display_name
poin = data["poin"]
try:
gambar = line_bot_api.get_profile(sender).picture_url
except:
gambar = ""
line_bot_api.reply_message(event.reply_token, [
TextSendMessage(text='Kak '+panggil(sender)+' salah :('),
hasil_akhir(nama, nomor-1, poin, gambar)
]
)
del soal[kirim]
del selesai[kirim]
else:
main = qz.child("Quiz").child("Skor").child(kirim).child(sender).get().val()
try:
poin = main["poin"]
except:
poin = 0
if sender not in playah[kirim]["pemain"]:return
benar = kebenaran[kirim]["benar"]
salah = kebenaran[kirim]["salah"]
nyerah = kebenaran[kirim]["nyerah"]
if sender in benar or sender in salah or sender in nyerah:return
if menjawab == 'Benar':
if sender not in benar or sender not in salah or sender not in nyerah:
if len(kebenaran[kirim]["benar"]) == 0:
poin += 5
kebenaran[kirim]["benar"].append(sender)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' benar dan mendapatkan 5 poin. Total: '+str(poin)+' poin ;D'))
elif len(kebenaran[kirim]["benar"]) == 1:
poin += 3
kebenaran[kirim]["benar"].append(sender)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' benar dan mendapatkan 3 poin. Total: '+str(poin)+' poin ;D'))
elif len(kebenaran[kirim]["benar"]) == 2:
poin += 1
kebenaran[kirim]["benar"].append(sender)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' benar dan mendapatkan 1 poin. Total: '+str(poin)+' poin ;D'))
else:
kebenaran[kirim]["benar"].append(sender)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' benar ;)'))
else:
if (sender not in kebenaran[kirim]["benar"]) or (sender not in kebenaran[kirim]["salah"]) or (sender not in kebenaran[kirim]["nyerah"]):
poin = poin - 1
kebenaran[kirim]["salah"].append(sender)
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Kak '+panggil(sender)+' salah, dikurangi 1 poin. :(\nTotal: '+str(poin)+' poin.'))
if nomor < 10:
benar = len(kebenaran[kirim]["benar"])
salah = len(kebenaran[kirim]["salah"])
nyerah = len(kebenaran[kirim]["nyerah"])
if (benar + salah + nyerah) == len(playah[kirim]["pemain"]):
pertanyaan = qz.child("Quiz").child("Pilihan").get().val()
tanya = random.choice([i for i in pertanyaan])
pilihan = [i for i in pertanyaan[tanya]["Jawaban"]]
film = pertanyaan[tanya]["Film"]
try:
gambar = pertanyaan[tanya]["Gambar"]
except:
gambar = ""
nomor = nomor + 1
soal.update({kirim:[nomor, tanya, time.time()]})
line_bot_api.push_message(kirim, film_quiz("Pertanyaan "+str(nomor)+"/10", tanya, film, pilihan, gambar))
nyerah = [i for i in kebenaran[kirim]["nyerah"]]
kebenaran.update({kirim:{"benar":[],"salah":[],"nyerah":nyerah}})
t = Timer(60, waktu_main, (nomor, kirim))
t.start()
else:
skornya = qz.child("Quiz").child("Skor").child(kirim).get().val()
skor_trakhir = {}
for u in skornya:
total_skor = skornya[u]["poin"] + poin
skor_trakhir.update({u:total_skor})
line_bot_api.reply_message(event.reply_token, skor_akhir(skor_trakhir))
del playah[kirim]
del kebenaran[kirim]
data = {"poin":poin,"waktu":time.time()}
qz.child("Quiz").child("Skor").child(kirim).child(sender).set(data)
except Exception as e:
try:
et, ev, tb = sys.exc_info()
lineno = tb.tb_lineno
fn = tb.tb_frame.f_code.co_filename
if sender != owner:
line_bot_api.reply_message(event.reply_token, [
TextSendMessage(text='Oopps.. '+namaBot.capitalize()+' ada kesalahan kak :('),
TextSendMessage(text='Tapi tenang kak, laporan kesalahan ini terkirim ke owner untuk diperbaiki ;D')
]
)
line_bot_api.push_message(owner, TextSendMessage(text="[Expectation Failed] %s Line %i - %s"% (fn, lineno, str(e))))
except:
line_bot_api.push_message(owner, TextSendMessage(text="Undescribeable error detected!!"))
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
if isinstance(event.source, SourceGroup):
kirim = event.source.sender_id
elif isinstance(event.source, SourceRoom):
kirim = event.source.room_id
else:
kirim = event.source.user_id
sender = event.source.user_id
profil = line_bot_api.get_profile(sender)
text = event.message.text
if text == '/mulai':
if kirim in playah:
if playah[kirim]["status"] == 'pending':
para_pemain = [i for i in playah[kirim]["pemain"]]
playah[kirim].update({"status":"mulai","pemain":para_pemain})
pertanyaan = qz.child("Quiz").child("Pilihan").get().val()
tanya = random.choice([i for i in pertanyaan])
pilihan = [i for i in pertanyaan[tanya]["Jawaban"]]
film = pertanyaan[tanya]["Film"]
try:
gambar = pertanyaan[tanya]["Gambar"]
except:
gambar = ""
nomor = 1
kebenaran.update({kirim:{"benar":[],"salah":[],"nyerah":[]}})
soal.update({kirim:[nomor, tanya, time.time()]})
t = Timer(20, waktu_main, (nomor, kirim))
t.start()
line_bot_api.reply_message(event.reply_token, [
TextSendMessage(text='Permainan dimulai ;)'),
film_quiz("Pertanyaan "+str(nomor)+"/10", tanya, film, pilihan, gambar)
]
)
else:
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Permainan sudah dimulai ._.'))