Skip to content

Commit e433477

Browse files
committed
refactor: reduce complexity of TWSocket.handleMessage
1 parent 825485c commit e433477

1 file changed

Lines changed: 112 additions & 107 deletions

File tree

scratchattach/eventhandlers/cloud_server.py

Lines changed: 112 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -12,127 +12,132 @@
1212

1313

1414
class TwCloudSocket(WebSocket):
15-
def handleMessage(self):
16-
if not self.server.running:
17-
return
18-
try:
19-
if self.server.check_for_ip_ban(self):
20-
return
21-
22-
data = json.loads(self.data)
23-
print(data)
24-
25-
if data["method"] == "set":
26-
# cloud variable set received
27-
# check if project_id is in whitelisted projects (if there's a list of whitelisted projects)
28-
if self.server.whitelisted_projects is not None:
29-
if data["project_id"] not in self.server.whitelisted_projects:
30-
self.close(4002)
31-
if self.server.log_var_sets:
32-
print(
33-
self.address[0] + ":" + str(self.address[1]),
34-
"tried to set a var on non-whitelisted project and was disconnected, project:",
35-
data["project_id"],
36-
"user:",
37-
data["user"],
38-
)
39-
return
40-
# check if value is valid
41-
if not self.server._check_value(data["value"]):
42-
if self.server.log_var_sets:
43-
print(self.address[0] + ":" + str(self.address[1]), "sent an invalid var value")
44-
return
45-
# perform cloud var and forward to other players
15+
server: TwCloudServer
16+
17+
def handle_set(self, data: dict):
18+
# cloud variable set received
19+
# check if project_id is in whitelisted projects (if there's a list of whitelisted projects)
20+
if self.server.whitelisted_projects is not None:
21+
if data["project_id"] not in self.server.whitelisted_projects:
22+
self.close(4002)
4623
if self.server.log_var_sets:
4724
print(
4825
self.address[0] + ":" + str(self.address[1]),
49-
f"set {data['name']} to {data['value']}, project:",
50-
str(data["project_id"]),
26+
"tried to set a var on non-whitelisted project and was disconnected, project:",
27+
data["project_id"],
5128
"user:",
5229
data["user"],
5330
)
54-
self.server.set_var(data["project_id"], data["name"], data["value"], user=data["user"], skip_forward=self)
55-
send_to_clients = {
56-
"method": "set",
57-
"user": data["user"],
58-
"project_id": data["project_id"],
59-
"name": data["name"],
60-
"value": data["value"],
61-
"timestamp": round(time.time() * 1000),
62-
"server": "scratchattach/2.0.0",
63-
}
64-
# raise event
65-
_a = cloud_activity.CloudActivity(timestamp=time.time() * 1000)
66-
data["name"] = data["name"].replace("☁ ", "")
67-
_a._update_from_dict(send_to_clients)
68-
self.server.call_event("on_set", [_a, self])
69-
70-
elif data["method"] == "handshake":
71-
data = json.loads(self.data)
72-
# check if handshake is valid
73-
if not "user" in data:
74-
print(self.address[0] + ":" + str(self.address[1]), "tried to handshake without providing a username")
75-
self.close(4002)
76-
return
77-
if not "project_id" in data:
78-
print(self.address[0] + ":" + str(self.address[1]), "tried to handshake without providing a project_id")
79-
self.close(4002)
80-
return
81-
# check if project_id is in username is allowed
82-
if self.server.allow_nonscratch_names is False:
83-
if not User(username=data["user"]).does_exist():
84-
print(
85-
self.address[0] + ":" + str(self.address[1]),
86-
"tried to handshake using a username not existing on Scratch, project:",
87-
data["project_id"],
88-
"user:",
89-
data["user"],
90-
)
91-
self.close(4002)
92-
return
93-
# check if project_id is in whitelisted projects (if there's a list of whitelisted projects)
94-
if self.server.whitelisted_projects is not None:
95-
if str(data["project_id"]) not in self.server.whitelisted_projects:
96-
self.close(4002)
97-
print(
98-
self.address[0] + ":" + str(self.address[1]),
99-
"tried to handshake on a non-whitelisted project:",
100-
data["project_id"],
101-
"user:",
102-
data["user"],
103-
)
104-
return
105-
# register handshake in users list (save username and project_id)
31+
return
32+
# check if value is valid
33+
if not self.server._check_value(data["value"]):
34+
if self.server.log_var_sets:
35+
print(self.address[0] + ":" + str(self.address[1]), "sent an invalid var value")
36+
return
37+
# perform cloud var and forward to other players
38+
if self.server.log_var_sets:
39+
print(
40+
self.address[0] + ":" + str(self.address[1]),
41+
f"set {data['name']} to {data['value']}, project:",
42+
str(data["project_id"]),
43+
"user:",
44+
data["user"],
45+
)
46+
self.server.set_var(data["project_id"], data["name"], data["value"], user=data["user"], skip_forward=self)
47+
send_to_clients = {
48+
"method": "set",
49+
"user": data["user"],
50+
"project_id": data["project_id"],
51+
"name": data["name"],
52+
"value": data["value"],
53+
"timestamp": round(time.time() * 1000),
54+
"server": "scratchattach/2.0.0",
55+
}
56+
# raise event
57+
_a = cloud_activity.CloudActivity(timestamp=time.time() * 1000)
58+
data["name"] = data["name"].replace("☁ ", "")
59+
_a._update_from_dict(send_to_clients)
60+
self.server.call_event("on_set", [_a, self])
61+
62+
def handle_handshake(self, data: dict):
63+
# check if handshake is valid
64+
if not "user" in data:
65+
print(self.address[0] + ":" + str(self.address[1]), "tried to handshake without providing a username")
66+
self.close(4002)
67+
return
68+
if not "project_id" in data:
69+
print(self.address[0] + ":" + str(self.address[1]), "tried to handshake without providing a project_id")
70+
self.close(4002)
71+
return
72+
# check if project_id is in username is allowed
73+
if self.server.allow_nonscratch_names is False:
74+
if not User(username=data["user"]).does_exist():
10675
print(
10776
self.address[0] + ":" + str(self.address[1]),
108-
"handshaked, project:",
77+
"tried to handshake using a username not existing on Scratch, project:",
10978
data["project_id"],
11079
"user:",
11180
data["user"],
11281
)
113-
self.server.tw_clients[self.address]["username"] = data["user"]
114-
self.server.tw_clients[self.address]["project_id"] = data["project_id"]
115-
# send current cloud variable values to the user who handshaked
116-
self.sendMessage(
117-
"\n".join(
118-
[
119-
json.dumps(
120-
{
121-
"method": "set",
122-
"project_id": data["project_id"],
123-
"name": "☁ " + varname,
124-
"value": self.server.tw_variables[str(data["project_id"])][varname],
125-
"server": "scratchattach/2.0.0",
126-
}
127-
)
128-
for varname in self.server.get_project_vars(str(data["project_id"]))
129-
]
130-
)
82+
self.close(4002)
83+
return
84+
# check if project_id is in whitelisted projects (if there's a list of whitelisted projects)
85+
if self.server.whitelisted_projects is not None:
86+
if str(data["project_id"]) not in self.server.whitelisted_projects:
87+
self.close(4002)
88+
print(
89+
self.address[0] + ":" + str(self.address[1]),
90+
"tried to handshake on a non-whitelisted project:",
91+
data["project_id"],
92+
"user:",
93+
data["user"],
13194
)
132-
self.sendMessage("This server uses @TimMcCool's scratchattach 2.0.0")
133-
# raise event
134-
self.server.call_event("on_handshake", [data["user"], data["project_id"], self])
95+
return
96+
# register handshake in users list (save username and project_id)
97+
print(
98+
self.address[0] + ":" + str(self.address[1]),
99+
"handshaked, project:",
100+
data["project_id"],
101+
"user:",
102+
data["user"],
103+
)
104+
self.server.tw_clients[self.address]["username"] = data["user"]
105+
self.server.tw_clients[self.address]["project_id"] = data["project_id"]
106+
# send current cloud variable values to the user who handshaked
107+
self.sendMessage(
108+
"\n".join(
109+
[
110+
json.dumps(
111+
{
112+
"method": "set",
113+
"project_id": data["project_id"],
114+
"name": "☁ " + varname,
115+
"value": self.server.tw_variables[str(data["project_id"])][varname],
116+
"server": "scratchattach/2.0.0",
117+
}
118+
)
119+
for varname in self.server.get_project_vars(str(data["project_id"]))
120+
]
121+
)
122+
)
123+
self.sendMessage("This server uses @TimMcCool's scratchattach 2.0.0")
124+
# raise event
125+
self.server.call_event("on_handshake", [data["user"], data["project_id"], self])
135126

127+
def handleMessage(self):
128+
if not self.server.running:
129+
return
130+
try:
131+
if self.server.check_for_ip_ban(self):
132+
return
133+
134+
data = json.loads(self.data)
135+
print(data)
136+
137+
if data["method"] == "set":
138+
self.handle_set(data)
139+
elif data["method"] == "handshake":
140+
self.handle_handshake(data)
136141
else:
137142
print(
138143
"Error:",

0 commit comments

Comments
 (0)