Skip to content

Commit 6a2ff14

Browse files
committed
Merge pull request #42 from d-Rickyy-b/State_Handling
State handling
2 parents 8c321da + 994e08d commit 6a2ff14

File tree

10 files changed

+146
-65
lines changed

10 files changed

+146
-65
lines changed

database/statistics.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# -*- coding: utf-8 -*-
2-
from time import time
2+
import logging
33
from datetime import datetime
4+
from time import time
5+
46
from database.db_wrapper import DBwrapper
5-
import logging
67

78
__author__ = 'Rico'
89
logger = logging.getLogger(__name__)
@@ -27,10 +28,10 @@ def add_game_played(user_id):
2728

2829
def get_stats(percentage):
2930
text = ""
30-
perc = int(percentage//10+1)
31+
perc = int(percentage // 10 + 1)
3132
for _ in range(perc):
3233
text += "🏆"
33-
for _ in range(10-perc):
34+
for _ in range(10 - perc):
3435
text += "🔴"
3536
return text
3637

game/blackJack.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
from telegram.replykeyboardmarkup import ReplyKeyboardMarkup
77

88
from database.statistics import add_game_played, set_game_won
9-
from game.deck import CardDeck
109
from game.dealer import Dealer
10+
from game.deck import CardDeck
1111
from game.message import Message
1212
from game.player import Player
1313
from lang.language import translate
1414

15-
__author__ = 'Rico & Julian'
15+
__author__ = 'Rico'
1616

1717

1818
class BlackJack(object):

game/dealer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# -*- coding: utf-8 -*-
2+
13
from game.player import Player
24

35

game/deck.py

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,31 @@
66

77

88
class CardDeck(object):
9-
symbols = ["♥", "♦", "♣", "♠"]
10-
valueInt = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
11-
12-
@staticmethod
13-
def create_deck():
14-
from random import shuffle
15-
deck = list(range(1, 52))
16-
shuffle(deck)
17-
return deck[:]
18-
19-
def pick_one_card(self):
20-
card = self.deck[0]
21-
self.deck.pop(0)
22-
return card
23-
24-
def get_card_name(self, card):
25-
symbol = self.symbols[card // 13]
26-
value = self.value_str[card % 13]
27-
card_name = "|" + symbol + " " + value + "|"
28-
return card_name
29-
30-
def get_card_value(self, card):
31-
return self.valueInt[card % 13]
32-
33-
def __init__(self, lang_id):
34-
self.deck = self.create_deck()
35-
self.value_str = [translate("ace", lang_id), "2", "3", "4", "5", "6", "7", "8", "9", "10",
36-
translate("jack", lang_id), translate("queen", lang_id), translate("king", lang_id)]
9+
symbols = ["♥", "♦", "♣", "♠"]
10+
valueInt = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
11+
12+
@staticmethod
13+
def create_deck():
14+
from random import shuffle
15+
deck = list(range(1, 52))
16+
shuffle(deck)
17+
return deck[:]
18+
19+
def pick_one_card(self):
20+
card = self.deck[0]
21+
self.deck.pop(0)
22+
return card
23+
24+
def get_card_name(self, card):
25+
symbol = self.symbols[card // 13]
26+
value = self.value_str[card % 13]
27+
card_name = "|" + symbol + " " + value + "|"
28+
return card_name
29+
30+
def get_card_value(self, card):
31+
return self.valueInt[card % 13]
32+
33+
def __init__(self, lang_id):
34+
self.deck = self.create_deck()
35+
self.value_str = [translate("ace", lang_id), "2", "3", "4", "5", "6", "7", "8", "9", "10",
36+
translate("jack", lang_id), translate("queen", lang_id), translate("king", lang_id)]

game/player.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# -*- coding: utf-8 -*-
2+
13
__author__ = 'Rico'
24

35

@@ -32,7 +34,7 @@ def get_cards_string(self):
3234
cards_string = ""
3335
for i, card in enumerate(self.cards):
3436
cards_string += self.deck.get_card_name(card)
35-
if i+1 < len(self.cards):
37+
if i + 1 < len(self.cards):
3638
cards_string += ", "
3739
return cards_string
3840

gamehandler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# -*- coding: utf-8 -*-
2+
13
import random
24
import string
35

main.py

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
from game.blackJack import BlackJack
1515
from gamehandler import GameHandler
1616
from lang.language import translate
17+
from statehandler import StateHandler
18+
from userstate import UserState
1719

1820
__author__ = 'Rico'
1921

@@ -31,7 +33,6 @@
3133

3234
game_handler = GameHandler()
3335
tg_bot = updater.bot
34-
comment_list = []
3536
lang_list = ["de", "en", "nl", "eo", "br", "es", "ru", "fa"]
3637

3738

@@ -44,6 +45,9 @@ def start(bot, update):
4445
username = update.message.from_user.username
4546
db = DBwrapper.get_instance()
4647

48+
state_handler = StateHandler.get_instance()
49+
user = state_handler.get_user(user_id)
50+
4751
if not db.is_user_saved(user_id):
4852
logger.info("New user")
4953
db.add_user(user_id, "en", first_name, last_name, username)
@@ -52,12 +56,10 @@ def start(bot, update):
5256
language(bot, update)
5357
return
5458

55-
if user_id in comment_list:
56-
comment_list.remove(user_id)
57-
5859
# check if user already has got a game (in the same chat):
5960
game_index = game_handler.get_index_by_chatid(chat_id)
6061
if game_index is None:
62+
user.set_state(UserState.PLAYING)
6163
logger.debug("Creating a game")
6264
lang_id = db.get_lang_id(user_id)
6365
bj = BlackJack(chat_id, user_id, lang_id, first_name, game_handler, message_id, send_message)
@@ -105,8 +107,10 @@ def join_secret(bot, update):
105107

106108
def stop(bot, update):
107109
user_id = update.message.from_user.id
108-
if user_id in comment_list:
109-
comment_list.remove(user_id)
110+
state_handler = StateHandler.get_instance()
111+
user = state_handler.get_user(user_id)
112+
113+
user.set_state(UserState.IDLE)
110114

111115
chat_id = update.message.chat_id
112116
game_handler.gl_remove(chat_id)
@@ -156,38 +160,49 @@ def comment(bot, update):
156160
lang_id = db.get_lang_id(user_id)
157161
text = update.message.text
158162
params = text.split()
159-
if game_handler.get_game_by_chatid(chat_id) is None:
163+
164+
state_handler = StateHandler.get_instance()
165+
user = state_handler.get_user(user_id)
166+
167+
if user.get_state() == UserState.IDLE:
160168
if len(params) > 1:
161169
text = " ".join(params[1:])
162170
logger.debug("New comment! {}!".format(user_id))
163-
send_message(chat_id, translate("userComment", lang_id))
164-
for admin_id in db.get_admins():
165-
send_message(admin_id, "New comment:\n\n{}\n\n{} | {} | {} | @{} | {}".format(text, user_id, first_name,
166-
last_name, username,
167-
lang_id))
168171

169-
if user_id in comment_list:
170-
logger.debug("Remove {} from comment_list!".format(user_id))
171-
comment_list.remove(user_id)
172+
bot.sendMessage(chat_id=chat_id, text=translate("userComment", lang_id))
173+
for admin_id in db.get_admins():
174+
bot.sendMessage(admin_id, "New comment:\n\n{}\n\n{} | {} | {} | @{} | {}".format(text, user_id, first_name,
175+
last_name, username,
176+
lang_id))
177+
logger.debug("Set {}'s state to IDLE!".format(user_id))
178+
user.set_state(UserState.IDLE)
172179
else:
173180
# The user just wrote "/comment" -> Ask him to send a message
174181
logger.debug("Add {} to comment_list!".format(user_id))
175-
comment_keyboard = ReplyKeyboardMarkup([[KeyboardButton(translate("cancel", lang_id))]])
176-
send_message(chat_id, translate("sendCommentNow", lang_id), reply_markup=comment_keyboard)
177-
if user_id not in comment_list:
178-
comment_list.append(user_id)
182+
183+
keyboard = [[InlineKeyboardButton(text=translate("cancel", lang_id), callback_data="cancel_comment")]]
184+
reply_markup = InlineKeyboardMarkup(keyboard)
185+
186+
bot.sendMessage(chat_id=chat_id, text=translate("sendCommentNow", lang_id), reply_markup=reply_markup)
187+
user.set_state(UserState.COMMENTING)
179188

180189

181190
def cancel(bot, update):
182-
user_id = update.message.from_user.id
191+
user_id = update.callback_query.from_user.id
192+
message_id = update.callback_query.message.message_id
193+
callback_query_id = update.callback_query.id
183194
chat_id = update.message.chat_id
184-
db = DBwrapper.get_instance()
185-
lang_id = db.get_lang_id(user_id)
186195

187-
if user_id in comment_list:
188-
comment_list.remove(user_id)
189-
# send message - cancelledMessage
190-
send_message(chat_id, translate("cancelledMessage", lang_id))
196+
state_handler = StateHandler.get_instance()
197+
user = state_handler.get_user(user_id)
198+
199+
if user.get_state() == UserState.COMMENTING:
200+
db = DBwrapper.get_instance()
201+
lang_id = db.get_lang_id(user_id)
202+
203+
user.set_state(UserState.IDLE)
204+
bot.editMessageText(chat_id=chat_id, message_id=message_id, text=translate("cancelledMessage", lang_id))
205+
bot.answerCallbackQuery(callback_query_id=callback_query_id, text=translate("cancelledMessage", lang_id))
191206

192207

193208
def answer(bot, update):
@@ -237,6 +252,8 @@ def callback_eval(bot, update):
237252
elif query_data == "com_ch_lang":
238253
language(bot, update)
239254

255+
elif query_data == "cancel_comment":
256+
cancel(bot, update)
240257

241258
def send_message(chat_id, text, message_id=None, parse_mode=None, reply_markup=None, game_id=None):
242259
tg_bot.sendMessage(chat_id=chat_id, text=text, reply_to_message_id=message_id, parse_mode=parse_mode,
@@ -264,15 +281,18 @@ def game_commands(bot, update):
264281
db = DBwrapper.get_instance()
265282
lang_id = db.get_lang_id(user_id)
266283

267-
if user_id in comment_list:
284+
state_handler = StateHandler.get_instance()
285+
user = state_handler.get_user(user_id)
286+
287+
if user.get_state() == UserState.COMMENTING:
268288
# User wants to comment!
269289
send_message(chat_id, translate("userComment", lang_id))
270290
for admin_id in db.get_admins():
271291
send_message(admin_id,
272292
"New comment:\n\n{}\n\n{} | {} | {} | @{} | {}".format(text, user_id, first_name, last_name,
273293
username, lang_id))
274294

275-
comment_list.remove(user_id)
295+
user.set_state(UserState.IDLE)
276296
return
277297

278298
if not db.is_user_saved(user_id):

statehandler.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from userstate import UserState
4+
5+
6+
class StateHandler(object):
7+
class __StateHandler(object):
8+
def __init__(self):
9+
self.user_list = []
10+
11+
def add_user(self, user_id: int) -> None:
12+
self.user_list.append(UserState(user_id))
13+
14+
def get_user(self, user_id: int) -> UserState:
15+
for userState in self.user_list:
16+
if userState.get_userid() == user_id:
17+
return userState
18+
19+
self.add_user(user_id)
20+
return self.get_user(user_id)
21+
22+
instance = None
23+
24+
def __init__(self):
25+
if not StateHandler.instance:
26+
StateHandler.instance = StateHandler.__StateHandler()
27+
28+
@staticmethod
29+
def get_instance():
30+
if not StateHandler.instance:
31+
StateHandler.instance = StateHandler.__StateHandler()
32+
33+
return StateHandler.instance

tests/test_blackJack.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
# -*- coding: utf-8 -*-
2+
13
from unittest import TestCase
2-
from game.blackJack import BlackJack
4+
35
from database.db_wrapper import DBwrapper
46

57

@@ -179,7 +181,7 @@ def pick_one_card(self):
179181
def get_card_name(self, card):
180182
symbol = self.symbols[card//13]
181183
value = self.value_str[card % 13]
182-
card_name = "|"+symbol+" "+value+"|"
184+
card_name = "|" + symbol + " " + value + "|"
183185
return card_name
184186

185187
def get_card_value(self, card):

userstate.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*- coding: utf-8 -*-
2+
3+
class UserState(object):
4+
IDLE = 0
5+
COMMENTING = 1
6+
PLAYING = 2
7+
8+
def __init__(self, user_id: int):
9+
self._user_id = user_id
10+
self._state = UserState.IDLE
11+
12+
def get_state(self) -> int:
13+
return self._state
14+
15+
def set_state(self, state: int) -> None:
16+
self._state = state
17+
18+
def get_userid(self) -> int:
19+
return self._user_id

0 commit comments

Comments
 (0)