1
1
import asyncio
2
+ from random import randint
2
3
from typing import Any
3
4
from urllib .parse import unquote
4
5
from http import HTTPStatus
10
11
from pyrogram .errors import AuthKeyUnregistered , FloodWait , Unauthorized , UserDeactivated
11
12
from pyrogram .raw .functions .messages .request_web_view import RequestWebView
12
13
13
- from bot .config import InvalidSession
14
+ from bot .config import InvalidSession , settings
14
15
from .headers import headers
15
16
from bot .utils import logger
16
17
@@ -47,7 +48,7 @@ async def get_tg_web_data(self, proxy: str | None) -> str:
47
48
48
49
while True :
49
50
try :
50
- peer = await self .tg_client .resolve_peer ('Yumify_Bot ' )
51
+ peer = await self .tg_client .resolve_peer ('GHArenaBot ' )
51
52
break
52
53
except FloodWait as fl :
53
54
fls = fl .value
@@ -100,7 +101,6 @@ async def get_me(self, http_client: ClientSession) -> dict:
100
101
await asyncio .sleep (delay = 3 )
101
102
102
103
async def change_settings (self , http_client : ClientSession , key : str , value : bool | Any ) -> True :
103
- """TODO skipTutorial:true"""
104
104
try :
105
105
response = await http_client .post (url = 'https://game.gh-arena.com/settings/' ,
106
106
json = {key : value })
@@ -122,7 +122,6 @@ async def get_quests(self, http_client: ClientSession) -> list[dict]:
122
122
await asyncio .sleep (delay = 3 )
123
123
124
124
async def get_quest_tasks (self , http_client : ClientSession , quest_id : int ) -> dict :
125
- """for task in resp['tasks']: ... | там лежат id и completed"""
126
125
try :
127
126
response = await http_client .get (url = f'https://game.gh-arena.com/quest/{ quest_id } /tasks/' )
128
127
response .raise_for_status ()
@@ -132,14 +131,22 @@ async def get_quest_tasks(self, http_client: ClientSession, quest_id: int) -> di
132
131
logger .error (f"{ self .session_name } | Unknown error when get quest tasks: { error } " )
133
132
await asyncio .sleep (delay = 3 )
134
133
135
- async def complete_task (self , http_client : ClientSession , task_id : int ) -> bool :
136
- """for task in resp['tasks']: ... | там лежат id и completed"""
134
+ async def complete_task (self , http_client : ClientSession , task_id : int ) -> dict :
137
135
try :
138
136
response = await http_client .post (url = f'https://game.gh-arena.com/task/{ task_id } /complete/' )
139
137
140
- return True if response .status == HTTPStatus . OK else False
138
+ return await response .json ()
141
139
except Exception as error :
142
- logger .error (f"{ self .session_name } | Unknown error when get quest tasks: { error } " )
140
+ logger .error (f"{ self .session_name } | Unknown error when complete task: { error } " )
141
+ await asyncio .sleep (delay = 3 )
142
+
143
+ async def complete_quest (self , http_client : ClientSession , quest_id : int ) -> dict :
144
+ try :
145
+ response = await http_client .post (url = f'https://game.gh-arena.com/quest/{ quest_id } /complete/' )
146
+
147
+ return await response .json ()
148
+ except Exception as error :
149
+ logger .error (f"{ self .session_name } | Unknown error when complete quest: { error } " )
143
150
await asyncio .sleep (delay = 3 )
144
151
145
152
async def check_proxy (self , http_client : ClientSession , proxy : Proxy ) -> None :
@@ -159,20 +166,56 @@ async def run(self, proxy: str | None) -> None:
159
166
if proxy :
160
167
await self .check_proxy (http_client = http_client , proxy = proxy )
161
168
169
+
170
+ tg_web_data = await self .get_tg_web_data (proxy = proxy )
171
+ login = await self .login (http_client = http_client , tg_web_data = tg_web_data )
172
+ user = await self .get_me (http_client )
173
+ balance_gold = user ['balance' ]
174
+ balance_gem = user ['gem' ]
175
+ logger .success (f"{ self .session_name } | Login! Balance: { balance_gold } gold | { balance_gem } gems" )
176
+ await asyncio .sleep (0.5 )
177
+ await self .change_settings (http_client , 'skipTutorial' , True )
178
+
179
+ attempt = 1
180
+ while login is not True :
181
+ sleep_time = randint (* settings .RELOGIN_DELAY )
182
+ logger .info (f"{ self .session_name } | Problems when login, sleep { sleep_time } s before attempt #{ attempt + 1 } " )
183
+ await asyncio .sleep (sleep_time )
184
+ tg_web_data = await self .get_tg_web_data (proxy = proxy )
185
+ login = await self .login (http_client = http_client , tg_web_data = tg_web_data )
186
+ attempt += 1
187
+ if attempt > 5 :
188
+ return logger .info (f"{ self .session_name } | All login attempts spent" )
189
+
190
+
162
191
quests = await self .get_quests (http_client )
163
192
await asyncio .sleep (1 )
164
193
for quest in quests :
194
+ quest_name = quest ['name' ]
195
+ quest_rewards = quest ['gold' ] if quest ['gold' ] is not None else quest ['gem' ]
196
+ quest_rewards_type = 'gems' if quest ['gem' ] is not None else 'gold'
165
197
quest_tasks = (await self .get_quest_tasks (http_client , quest_id = quest ['id' ])).get ('tasks' )
198
+ await asyncio .sleep (1.5 )
166
199
for task in quest_tasks :
167
200
task_name = task ['name' ]
168
201
if task ['completed' ] is True :
169
202
logger .info (f"{ self .session_name } | Task '{ task_name } ' is already completed, Skip.." )
170
203
continue
171
- success_completed = await self .complete_task (http_client , task_id = task ['id' ])
172
- if success_completed is True :
173
- logger .success (f"{ self .session_name } | Successfully completed task '{ task_name } '!" )
204
+ complete = await self .complete_task (http_client , task_id = task ['id' ])
205
+ sleep_time = randint (* settings .SLEEP_BETWEEN_TASK )
206
+ await asyncio .sleep (sleep_time )
207
+ if (complete_error := complete .get ('error' , None )) is not None :
208
+ logger .warning (f"{ self .session_name } | Error when complete task '{ task_name } ': '{ complete_error } '" )
174
209
else :
175
- logger .warning (f"{ self .session_name } | Problems when complete task '{ task_name } '.." )
210
+ logger .success (f"{ self .session_name } | Successfully completed task '{ task_name } '!" )
211
+
212
+ complete_quest = await self .complete_quest (http_client , quest_id = quest ['id' ])
213
+ sleep_time = randint (* settings .SLEEP_BETWEEN_TASK )
214
+ await asyncio .sleep (sleep_time )
215
+ if (complete_error := complete_quest .get ('error' , None )) is not None :
216
+ logger .warning (f"{ self .session_name } | Problems when complete quest '{ quest_name } ': '{ complete_error } '" )
217
+ else :
218
+ logger .success (f"{ self .session_name } | Successfully completed quest '{ quest_name } '! +{ quest_rewards } { quest_rewards_type } " )
176
219
177
220
178
221
async def run_tapper (tg_client : Client , proxy : str | None ):
0 commit comments