Skip to content

Commit 3d12bdb

Browse files
committed
2.9.5 fixes
1 parent 54ebe19 commit 3d12bdb

File tree

3 files changed

+94
-12
lines changed

3 files changed

+94
-12
lines changed

docs/source/changelog.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ Glossary
3232
Releases
3333
----------------------
3434

35+
v2.9.5
36+
=================
37+
- Fixed incorrect caching of the SQL logs, causing incorrect values to be returned back to the GUI.
38+
- Fixed detection of browser automation on searching for new guilds to join.
39+
40+
3541
v2.9.4
3642
=================
3743
- Fixed :class:`AutoGUILD` concurrent access. When updating AutoGUILD, the update method did not block

src/daf/logging/sql/tables.py

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,7 @@
1717

1818
class ORMBase(DeclarativeBase):
1919
"Base for all of ORM classes"
20-
21-
def __eq__(self, value: object) -> bool:
22-
try:
23-
return self.__dict__["id"] == value.__dict__["id"]
24-
except KeyError:
25-
return False
26-
27-
def __hash__(self):
28-
return hash(type(self)) << 4 | self.__dict__.get("id", id(self))
20+
pass
2921

3022

3123
class MessageTYPE(ORMBase):
@@ -49,6 +41,12 @@ class MessageTYPE(ORMBase):
4941
def __init__(self, name: str = None):
5042
self.name = name
5143

44+
def __eq__(self, __value: object) -> bool:
45+
return isinstance(__value, MessageTYPE) and self.id == __value.id
46+
47+
def __hash__(self):
48+
return hash(self.id)
49+
5250

5351
class MessageMODE(ORMBase):
5452
"""
@@ -72,6 +70,12 @@ class MessageMODE(ORMBase):
7270
def __init__(self, name: str = None):
7371
self.name = name
7472

73+
def __eq__(self, __value: object) -> bool:
74+
return isinstance(__value, MessageMODE) and self.id == __value.id
75+
76+
def __hash__(self):
77+
return self.id
78+
7579

7680
class GuildTYPE(ORMBase):
7781
"""
@@ -95,6 +99,12 @@ class GuildTYPE(ORMBase):
9599
def __init__(self, name: str = None):
96100
self.name = name
97101

102+
def __eq__(self, __value: object) -> bool:
103+
return isinstance(__value, GuildTYPE) and self.id == __value.id
104+
105+
def __hash__(self):
106+
return self.id
107+
98108

99109
class GuildUSER(ORMBase):
100110
"""
@@ -126,6 +136,12 @@ def __init__(self, guild_type: GuildTYPE, snowflake: int, name: str):
126136
self.name = name
127137
self.guild_type = guild_type
128138

139+
def __eq__(self, __value: object) -> bool:
140+
return isinstance(__value, GuildUSER) and self.id == __value.id
141+
142+
def __hash__(self):
143+
return self.id
144+
129145

130146
class CHANNEL(ORMBase):
131147
"""
@@ -156,6 +172,12 @@ def __init__(self, snowflake: int, name: str, guild: GuildUSER):
156172
self.name = name
157173
self.guild = guild
158174

175+
def __eq__(self, __value: object) -> bool:
176+
return isinstance(__value, CHANNEL) and self.id == __value.id
177+
178+
def __hash__(self):
179+
return self.id
180+
159181

160182
class DataHISTORY(ORMBase):
161183
"""
@@ -180,6 +202,12 @@ class DataHISTORY(ORMBase):
180202
def __init__(self, content: dict):
181203
self.content = content
182204

205+
def __eq__(self, __value: object) -> bool:
206+
return isinstance(__value, DataHISTORY) and self.id == __value.id
207+
208+
def __hash__(self):
209+
return self.id
210+
183211

184212
class MessageChannelLOG(ORMBase):
185213
"""
@@ -208,6 +236,15 @@ def __init__(self, channel: CHANNEL, reason: str = None):
208236
self.channel = channel
209237
self.reason = reason
210238

239+
def __eq__(self, __value: object) -> bool:
240+
return (
241+
isinstance(__value, MessageChannelLOG) and
242+
(self.channel_id, self.log_id) == (__value.channel_id, __value.log_id)
243+
)
244+
245+
def __hash__(self):
246+
return hash((self.channel_id, self.log_id))
247+
211248

212249
class MessageLOG(ORMBase):
213250
"""
@@ -289,6 +326,12 @@ def __init__(
289326
self.timestamp = datetime.now()
290327
self.channels = channels
291328

329+
def __eq__(self, __value: object) -> bool:
330+
return isinstance(__value, MessageLOG) and self.id == __value.id
331+
332+
def __hash__(self):
333+
return self.id
334+
292335

293336
class Invite(ORMBase):
294337
__tablename__ = "Invite"
@@ -307,6 +350,12 @@ def __init__(self, discord_id: str, guild: GuildUSER):
307350
self.discord_id = discord_id
308351
self.guild = guild
309352

353+
def __eq__(self, __value: object) -> bool:
354+
return isinstance(__value, Invite) and self.id == __value.id
355+
356+
def __hash__(self):
357+
return self.id
358+
310359

311360
class InviteLOG(ORMBase):
312361
__tablename__ = "InviteLOG"
@@ -328,3 +377,9 @@ def __init__(self, invite: Invite, member: GuildUSER):
328377
self.invite = invite
329378
self.member = member
330379
self.timestamp = datetime.now()
380+
381+
def __eq__(self, __value: object) -> bool:
382+
return isinstance(__value, InviteLOG) and self.id == __value.id
383+
384+
def __hash__(self):
385+
return self.id

src/daf/web.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class GLOBALS:
6464
WD_TIMEOUT_MED = 15
6565
WD_TIMEOUT_30 = 30
6666
WD_TIMEOUT_LONG = 90
67+
68+
WD_FETCH_INVITE_CLOUDFLARE_TRIES = 5
6769
WD_RD_CLICK_UPPER_N = 5
6870
WD_RD_CLICK_LOWER_N = 2
6971
WD_OUTPUT_PATH = pathlib.Path.home().joinpath("daf/daf_web_data")
@@ -145,6 +147,7 @@ async def initialize(self) -> None:
145147
opts.add_argument("--no-first-run")
146148
opts.add_argument("--disable-background-networking")
147149
opts.add_argument("--disable-sync")
150+
opts.add_argument("--disable-popup-blocking")
148151

149152
if self._proxy is not None:
150153
proxy = self._proxy.split("://") # protocol, url
@@ -293,10 +296,28 @@ async def fetch_invite_link(self, url: str):
293296
trace(f"Fetching invite link from {url}", TraceLEVELS.DEBUG)
294297
driver = self.driver
295298
main_window_handle = driver.current_window_handle
296-
driver.switch_to.new_window("tab")
297-
await self.async_execute(driver.get, url)
298-
await asyncio.sleep(1)
299+
# Open a new tab with javascript to bypass detection
300+
driver.execute_script("window.open('https://top.gg', '_blank');") # Open a new tab
301+
await asyncio.sleep(3)
302+
new_handle = driver.window_handles[-1]
299303
try:
304+
for i in range(WD_FETCH_INVITE_CLOUDFLARE_TRIES):
305+
with suppress(NoSuchElementException):
306+
driver.switch_to.window(new_handle)
307+
trace("Finding 'challenge-running' cloudflare ID", TraceLEVELS.DEBUG)
308+
driver.find_element(By.ID, "challenge-running")
309+
driver.switch_to.window(main_window_handle)
310+
await asyncio.sleep(5 * (i + 1))
311+
continue
312+
313+
await asyncio.sleep(2)
314+
driver.switch_to.window(new_handle)
315+
trace("No 'challenge-running' found. Checks suceeded", TraceLEVELS.DEBUG)
316+
break
317+
else:
318+
raise RuntimeError("Could not complete cloudflare checks")
319+
320+
await self.async_execute(driver.get, url)
300321
await self.async_execute(
301322
WebDriverWait(driver, WD_TIMEOUT_LONG).until,
302323
url_contains("discord.com")

0 commit comments

Comments
 (0)