forked from VilksJanis/online_game
/
database_functions.py
111 lines (85 loc) · 3.5 KB
/
database_functions.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
import uuid
import json
from datetime import datetime
SECONDS_IN_DAY = 60 * 60 * 24
class BaseFunctionBuilder():
def __init__(self, command_name):
self.command_name = command_name
def is_registered(self):
"""
Determines if function is already registered in redis database.
Makes a `RG.DUMPREGISTRATIONS` call. Seeks for match between self.command_name and RegistrationData arguments.
Returns:
is registered (boolean)
"""
dumped_registrations = execute("RG.DUMPREGISTRATIONS")
if not dumped_registrations:
return False
for registration in dumped_registrations:
data = dict(zip(registration[0::2], registration[1::2]))
registration_data = dict(zip(data['RegistrationData'][0::2], data['RegistrationData'][1::2]))
if self.command_name in registration_data['args']:
return True
return False
def register_command(self):
"""
Registers a redis gears function to redis.
This is a super class placeholder function meant to be overridden.
Raises:
NotImplementedError()
"""
raise NotImplementedError(self.__class__.__name__)
class CreateNewGameFunctionBuilder(BaseFunctionBuilder):
def __init__(self):
super().__init__(command_name='create_new_game')
def register_command(self):
"""
Registers create_new_game redis gears fucntion to redis.
For each generate_new_game call creates a new HASH under game namespace:
GAME:[game_id] owner [user_id], secret [hash], private [bool], playercount [int]
Returns:
redis key [GAME:game_id]
Trigger example:
RG.TRIGGER create_new_game USER:123 1 secret123
"""
def subcall(user, private=0, secret=""):
game_id = uuid.uuid4().hex
key = f"GAME:{game_id}"
execute("HSET", key, "owner", user, "secret", str(secret), "private", int(private), "playercount", 0)
execute("EXPIRE", key, SECONDS_IN_DAY)
return game_id
(
GB('CommandReader')
.map(lambda x: subcall(*x[1:]))
.register(trigger=self.command_name, mode='sync')
)
class CreateUserFunctionBuilder(BaseFunctionBuilder):
def __init__(self):
super().__init__(command_name='create_new_user')
def register_command(self):
"""
Registers create_new_user redis gears fucntion to redis.
For each create_new_user call creates a new HASH under user namespace:
USER:[u_id] name [str], settings [str], secret [str]
Returns:
redis key [USER:u_id]
Trigger example:
RG.TRIGGER create_new_user hhaa Player1 '' aahh
"""
def subcall(user_id, name, settings='{}', secret=""):
key = f"USER:{user_id}"
execute("HSET", key, "name", name, "setttings", settings, "secret", str(secret))
execute("EXPIRE", key, SECONDS_IN_DAY * 30)
return key
(
GB('CommandReader')
.map(lambda x: subcall(*x[1:]))
.register(trigger=self.command_name)
)
database_functions = [
CreateNewGameFunctionBuilder(),
CreateUserFunctionBuilder()
]
for db_function in database_functions:
if not db_function.is_registered():
db_function.register_command()