Spaces:
Paused
Paused
Download main.py from matrixcoder/emote-api: direct link, hf CLI and curl.
- Browser
- Download file 38.1 kB
-
https://huggingface.co/spaces/matrixcoder/emote-api/resolve/main/main.py
- Command line
-
hf download hf://spaces/matrixcoder/emote-api/main.py
-
curl -L -o main.py https://huggingface.co/spaces/matrixcoder/emote-api/resolve/main/main.py
38.1 kB
| import requests , os , psutil , sys , jwt , pickle , json , binascii , time , urllib3 , base64 , datetime , re , socket , threading , ssl , pytz , aiohttp | |
| from protobuf_decoder.protobuf_decoder import Parser | |
| from xC4 import * ; from xHeaders import * | |
| from datetime import datetime | |
| from google.protobuf.timestamp_pb2 import Timestamp | |
| from concurrent.futures import ThreadPoolExecutor | |
| from threading import Thread | |
| from Pb2 import DEcwHisPErMsG_pb2 , MajoRLoGinrEs_pb2 , PorTs_pb2 , MajoRLoGinrEq_pb2 , sQ_pb2 , Team_msg_pb2 | |
| from cfonts import render, say | |
| #EMOTES BY MatrixCoder | |
| urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) | |
| # Global variables for API access - FILE START में | |
| online_writer = None | |
| whisper_writer = None | |
| key = None | |
| iv = None | |
| region = None | |
| # बाकी सब कुछ वैसा ही रहने दें... | |
| # ... rest of your existing global variables | |
| spam_room = False | |
| spammer_uid = None | |
| spam_chat_id = None | |
| spam_uid = None | |
| Spy = False | |
| Chat_Leave = False | |
| # Add to main.py at top with other globals: | |
| team_members_data = [] | |
| team_history = [] | |
| current_team_leader = None | |
| team_collection_active = False | |
| last_member_update = None | |
| previous_team_state = set() | |
| previous_team_uids = set() # Track previous state | |
| #################################### | |
| Hr = { | |
| 'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 11; ASUS_Z01QD Build/PI)", | |
| 'Connection': "Keep-Alive", | |
| 'Accept-Encoding': "gzip", | |
| 'Content-Type': "application/x-www-form-urlencoded", | |
| 'Expect': "100-continue", | |
| 'X-Unity-Version': "2018.4.11f1", | |
| 'X-GA': "v1 1", | |
| 'ReleaseVersion': "OB52"} | |
| def get_random_color(): | |
| colors = [ | |
| "[FF0000]", "[00FF00]", "[0000FF]", "[FFFF00]", "[FF00FF]", "[00FFFF]", "[FFFFFF]", "[FFA500]", | |
| "[A52A2A]", "[800080]", "[000000]", "[808080]", "[C0C0C0]", "[FFC0CB]", "[FFD700]", "[ADD8E6]", | |
| "[90EE90]", "[D2691E]", "[DC143C]", "[00CED1]", "[9400D3]", "[F08080]", "[20B2AA]", "[FF1493]", | |
| "[7CFC00]", "[B22222]", "[FF4500]", "[DAA520]", "[00BFFF]", "[00FF7F]", "[4682B4]", "[6495ED]", | |
| "[5F9EA0]", "[DDA0DD]", "[E6E6FA]", "[B0C4DE]", "[556B2F]", "[8FBC8F]", "[2E8B57]", "[3CB371]", | |
| "[6B8E23]", "[808000]", "[B8860B]", "[CD5C5C]", "[8B0000]", "[FF6347]", "[FF8C00]", "[BDB76B]", | |
| "[9932CC]", "[8A2BE2]", "[4B0082]", "[6A5ACD]", "[7B68EE]", "[4169E1]", "[1E90FF]", "[191970]", | |
| "[00008B]", "[000080]", "[008080]", "[008B8B]", "[B0E0E6]", "[AFEEEE]", "[E0FFFF]", "[F5F5DC]", | |
| "[FAEBD7]" | |
| ] | |
| return random.choice(colors) | |
| # | |
| # ============================================ | |
| # BROADCAST FUNCTION - WebSocket Updates | |
| # ============================================ | |
| def broadcast_team_change(event_type, team_data): | |
| """Broadcast team changes to WebSocket clients with data validation""" | |
| try: | |
| # Validate data before sending | |
| if event_type in ['member_joined', 'member_left']: | |
| player = team_data.get('player', {}) | |
| # Ensure all required fields exist | |
| validated_player = { | |
| 'uid': str(player.get('uid', 'unknown')), | |
| 'name': player.get('name', 'Unknown'), | |
| 'region': player.get('region', 'UNK'), | |
| 'level': int(player.get('level', 0)), | |
| 'character': str(player.get('character', 'Unknown')), | |
| 'position': player.get('position', 'Member') | |
| } | |
| team_data['player'] = validated_player | |
| # Debug log | |
| print(f"[WS-PREP] {event_type}: {validated_player['name']} (Level {validated_player['level']})") | |
| from api import broadcast_team_update | |
| broadcast_team_update(event_type, team_data) | |
| except Exception as e: | |
| print(f"[WS-ERROR] Failed to broadcast: {e}") | |
| # ============================================ | |
| # TEAM COLLECTION WITH STATE MANAGEMENT | |
| # ============================================ | |
| async def collect_team_members_dynamic(packet_type, parsed_data): | |
| """Team collection with proper state management and WebSocket broadcasting""" | |
| global team_members_data, current_team_leader, team_collection_active | |
| global last_member_update, previous_team_uids | |
| try: | |
| if packet_type != '0500_LARGE': | |
| return False | |
| new_members = [] | |
| # Leader detection | |
| if '1' in parsed_data and parsed_data['1'].get('data'): | |
| leader_uid = parsed_data['1']['data'] | |
| if leader_uid != current_team_leader: | |
| current_team_leader = leader_uid | |
| leader_info = await extract_complete_player_info(parsed_data, leader_uid, "Leader") | |
| if leader_info and leader_info['name'] != "Player_Unknown": | |
| if not any(m['uid'] == str(leader_uid) for m in new_members): | |
| new_members.append(leader_info) | |
| # Deep scan | |
| deep_players = await deep_scan_for_players(parsed_data) | |
| for player in deep_players: | |
| if not any(m['uid'] == player['uid'] for m in new_members): | |
| new_members.append(player) | |
| # Field structures | |
| if '5' in parsed_data and 'data' in parsed_data['5']: | |
| squad_data = parsed_data['5']['data'] | |
| field6_players = await extract_from_field_structure_fixed(squad_data) | |
| for player in field6_players: | |
| if not any(m['uid'] == player['uid'] for m in new_members): | |
| new_members.append(player) | |
| # Nested | |
| if '3' in squad_data and 'data' in squad_data['3']: | |
| nested_data = squad_data['3']['data'] | |
| nested_players = await extract_from_field_structure_fixed(nested_data) | |
| for player in nested_players: | |
| if not any(m['uid'] == player['uid'] for m in new_members): | |
| new_members.append(player) | |
| # ========== STATE CHANGE DETECTION ========== | |
| current_uids = set(m['uid'] for m in new_members) | |
| # Detect JOINED players | |
| joined = current_uids - previous_team_uids | |
| if joined: | |
| for uid in joined: | |
| player = next((m for m in new_members if m['uid'] == uid), None) | |
| if player: | |
| print(f"[TEAM] + {player['name']} joined") | |
| # Broadcast join event with COMPLETE data | |
| broadcast_team_change('member_joined', { | |
| 'player': { | |
| 'uid': player['uid'], | |
| 'name': player['name'], | |
| 'region': player['region'], | |
| 'level': player['level'], | |
| 'character': player.get('character', 'Unknown'), | |
| 'position': player['position'] | |
| }, | |
| 'total_members': len(current_uids) | |
| }) | |
| # Detect LEFT/KICKED players | |
| left = previous_team_uids - current_uids | |
| if left: | |
| for uid in left: | |
| old_player = next((m for m in team_members_data if m['uid'] == uid), None) | |
| if old_player: | |
| print(f"[TEAM] - {old_player['name']} left") | |
| # Broadcast leave event with COMPLETE data | |
| broadcast_team_change('member_left', { | |
| 'player': { | |
| 'uid': old_player['uid'], | |
| 'name': old_player['name'], | |
| 'region': old_player['region'], | |
| 'level': old_player['level'], | |
| 'character': old_player.get('character', 'Unknown'), | |
| 'position': old_player['position'] | |
| }, | |
| 'total_members': len(current_uids) | |
| }) | |
| # Update global state with ONLY current members | |
| team_members_data.clear() | |
| team_members_data.extend(new_members) | |
| previous_team_uids = current_uids | |
| # Update team status | |
| if len(new_members) > 0: | |
| if not team_collection_active: | |
| print(f"[TEAM] ✓ Joined team ({len(new_members)} members)") | |
| # Broadcast team joined with COMPLETE member data | |
| broadcast_team_change('team_joined', { | |
| 'in_team': True, | |
| 'total_members': len(new_members), | |
| 'leader_uid': str(current_team_leader) if current_team_leader else None, | |
| 'members': [ | |
| { | |
| 'uid': m['uid'], | |
| 'name': m['name'], | |
| 'region': m['region'], | |
| 'level': m['level'], | |
| 'character': m.get('character', 'Unknown'), | |
| 'position': m['position'] | |
| } | |
| for m in new_members | |
| ] | |
| }) | |
| team_collection_active = True | |
| last_member_update = datetime.now() | |
| return True | |
| else: | |
| # No members found - bot left team | |
| if team_collection_active: | |
| print(f"[TEAM] ✗ Left team") | |
| # Broadcast team left | |
| broadcast_team_change('team_left', { | |
| 'in_team': False, | |
| 'total_members': 0, | |
| 'members': [] | |
| }) | |
| team_collection_active = False | |
| team_members_data.clear() | |
| previous_team_uids.clear() | |
| current_team_leader = None | |
| return False | |
| except: | |
| return False | |
| async def extract_complete_player_info(parsed_data, uid, position="Member"): | |
| """Extract player info - Better name detection""" | |
| try: | |
| player_info = { | |
| 'uid': str(uid), | |
| 'name': None, # Will be set below | |
| 'region': 'UNK', | |
| 'level': 0, | |
| 'position': position, | |
| 'character': 'Unknown', | |
| 'timestamp': datetime.now().isoformat() | |
| } | |
| def find_player_details(obj, target_uid, depth=0): | |
| if depth > 5: | |
| return None | |
| if isinstance(obj, dict): | |
| if ('1' in obj and obj['1'].get('data') == target_uid): | |
| details = {} | |
| if '2' in obj and isinstance(obj['2'].get('data'), str): | |
| name = obj['2']['data'] | |
| if name and len(name) > 1 and not name.isdigit(): | |
| details['name'] = name | |
| if '3' in obj and isinstance(obj['3'].get('data'), str): | |
| details['region'] = obj['3']['data'] | |
| if '5' in obj and isinstance(obj['5'].get('data'), int): | |
| details['level'] = obj['5']['data'] | |
| if '6' in obj and isinstance(obj['6'].get('data'), (int, str)): | |
| details['character'] = str(obj['6']['data']) | |
| return details | |
| for key, value in obj.items(): | |
| if isinstance(value, dict): | |
| result = find_player_details(value, target_uid, depth+1) | |
| if result: | |
| return result | |
| elif isinstance(value, list): | |
| for item in value: | |
| if isinstance(item, dict): | |
| result = find_player_details(item, target_uid, depth+1) | |
| if result: | |
| return result | |
| return None | |
| details = find_player_details(parsed_data, uid) | |
| if details: | |
| player_info.update(details) | |
| # If still no name found, use UID as fallback | |
| if not player_info['name']: | |
| player_info['name'] = f"Player_{uid}" | |
| return player_info | |
| except: | |
| return None | |
| async def deep_scan_for_players(data, path="", depth=0): | |
| """Scan for players""" | |
| players = [] | |
| if depth > 6: | |
| return players | |
| if isinstance(data, dict): | |
| if ('1' in data and '2' in data and | |
| isinstance(data['1'].get('data'), (int, str)) and | |
| isinstance(data['2'].get('data'), str)): | |
| uid = data['1']['data'] | |
| name = data['2']['data'] | |
| if (name and | |
| name != "Player_Unknown" and | |
| not name.startswith("Player_") and | |
| not name.isdigit() and | |
| len(name) > 1): | |
| player = { | |
| 'uid': str(uid), | |
| 'name': name, | |
| 'region': data['3']['data'] if '3' in data and isinstance(data['3'].get('data'), str) else 'UNK', | |
| 'level': data['5']['data'] if '5' in data and isinstance(data['5'].get('data'), int) else 0, | |
| 'character': str(data['6']['data']) if '6' in data and isinstance(data['6'].get('data'), (int, str)) else 'Unknown', | |
| 'position': 'Leader' if str(uid) == str(current_team_leader) else 'Member', | |
| 'timestamp': datetime.now().isoformat() | |
| } | |
| players.append(player) | |
| for key, value in data.items(): | |
| if isinstance(value, (dict, list)): | |
| nested_players = await deep_scan_for_players(value, f"{path}.{key}", depth+1) | |
| players.extend(nested_players) | |
| elif isinstance(data, list): | |
| for item in data: | |
| if isinstance(item, (dict, list)): | |
| nested_players = await deep_scan_for_players(item, f"{path}[]", depth+1) | |
| players.extend(nested_players) | |
| return players | |
| async def extract_from_field_structure_fixed(squad_data): | |
| """Extract from field structure""" | |
| players = [] | |
| try: | |
| if '6' in squad_data and 'data' in squad_data['6']: | |
| player_data = squad_data['6']['data'] | |
| if isinstance(player_data, dict) and '1' in player_data and '2' in player_data: | |
| uid = player_data['1'].get('data') | |
| name = player_data['2'].get('data') | |
| if uid and isinstance(name, str) and len(name) > 1 and not name.isdigit(): | |
| player = { | |
| 'uid': str(uid), | |
| 'name': name, | |
| 'region': player_data['3']['data'] if '3' in player_data and isinstance(player_data['3'].get('data'), str) else 'UNK', | |
| 'level': player_data['5']['data'] if '5' in player_data and isinstance(player_data['5'].get('data'), int) else 0, | |
| 'character': str(player_data['6']['data']) if '6' in player_data and isinstance(player_data['6'].get('data'), (int, str)) else 'Unknown', | |
| 'position': 'Leader' if str(uid) == str(current_team_leader) else 'Member', | |
| 'timestamp': datetime.now().isoformat() | |
| } | |
| players.append(player) | |
| for pos in ['1', '2', '3', '4', '7', '8']: | |
| if pos in squad_data and 'data' in squad_data[pos]: | |
| player_data = squad_data[pos]['data'] | |
| if isinstance(player_data, dict) and '1' in player_data and '2' in player_data: | |
| uid = player_data['1'].get('data') | |
| name = player_data['2'].get('data') | |
| if uid and isinstance(name, str) and len(name) > 1 and not name.isdigit(): | |
| player = { | |
| 'uid': str(uid), | |
| 'name': name, | |
| 'region': player_data['3']['data'] if '3' in player_data and isinstance(player_data['3'].get('data'), str) else 'UNK', | |
| 'level': player_data['5']['data'] if '5' in player_data and isinstance(player_data['5'].get('data'), int) else 0, | |
| 'character': str(player_data['6']['data']) if '6' in player_data and isinstance(player_data['6'].get('data'), (int, str)) else 'Unknown', | |
| 'position': 'Leader' if str(uid) == str(current_team_leader) else 'Member', | |
| 'timestamp': datetime.now().isoformat() | |
| } | |
| players.append(player) | |
| except: | |
| pass | |
| return players | |
| async def encrypted_proto(encoded_hex): | |
| key = b'Yg&tc%DEuh6%Zc^8' | |
| iv = b'6oyZDr22E3ychjM%' | |
| cipher = AES.new(key, AES.MODE_CBC, iv) | |
| padded_message = pad(encoded_hex, AES.block_size) | |
| encrypted_payload = cipher.encrypt(padded_message) | |
| return encrypted_payload | |
| async def GeNeRaTeAccEss(uid , password): | |
| url = "https://100067.connect.garena.com/oauth/guest/token/grant" | |
| headers = { | |
| "Host": "100067.connect.garena.com", | |
| "User-Agent": (await Ua()), | |
| "Content-Type": "application/x-www-form-urlencoded", | |
| "Accept-Encoding": "gzip, deflate, br", | |
| "Connection": "close"} | |
| data = { | |
| "uid": uid, | |
| "password": password, | |
| "response_type": "token", | |
| "client_type": "2", | |
| "client_secret": "2ee44819e9b4598845141067b281621874d0d5d7af9d8f7e00c1e54715b7d1e3", | |
| "client_id": "100067"} | |
| async with aiohttp.ClientSession() as session: | |
| async with session.post(url, headers=Hr, data=data) as response: | |
| if response.status != 200: return "Failed to get access token" | |
| data = await response.json() | |
| open_id = data.get("open_id") | |
| access_token = data.get("access_token") | |
| return (open_id, access_token) if open_id and access_token else (None, None) | |
| async def EncRypTMajoRLoGin(open_id, access_token): | |
| major_login = MajoRLoGinrEq_pb2.MajorLogin() | |
| major_login.event_time = str(datetime.now())[:-7] | |
| major_login.game_name = "free fire" | |
| major_login.platform_id = 1 | |
| major_login.client_version = "1.120.2" | |
| major_login.system_software = "Android OS 9 / API-28 (PQ3B.190801.10101846/G9650ZHU2ARC6)" | |
| major_login.system_hardware = "Handheld" | |
| major_login.telecom_operator = "Verizon" | |
| major_login.network_type = "WIFI" | |
| major_login.screen_width = 1920 | |
| major_login.screen_height = 1080 | |
| major_login.screen_dpi = "280" | |
| major_login.processor_details = "ARM64 FP ASIMD AES VMH | 2865 | 4" | |
| major_login.memory = 3003 | |
| major_login.gpu_renderer = "Adreno (TM) 640" | |
| major_login.gpu_version = "OpenGL ES 3.1 v1.46" | |
| major_login.unique_device_id = "Google|34a7dcdf-a7d5-4cb6-8d7e-3b0e448a0c57" | |
| major_login.client_ip = "223.191.51.89" | |
| major_login.language = "en" | |
| major_login.open_id = open_id | |
| major_login.open_id_type = "4" | |
| major_login.device_type = "Handheld" | |
| memory_available = major_login.memory_available | |
| memory_available.version = 55 | |
| memory_available.hidden_value = 81 | |
| major_login.access_token = access_token | |
| major_login.platform_sdk_id = 1 | |
| major_login.network_operator_a = "Verizon" | |
| major_login.network_type_a = "WIFI" | |
| major_login.client_using_version = "7428b253defc164018c604a1ebbfebdf" | |
| major_login.external_storage_total = 36235 | |
| major_login.external_storage_available = 31335 | |
| major_login.internal_storage_total = 2519 | |
| major_login.internal_storage_available = 703 | |
| major_login.game_disk_storage_available = 25010 | |
| major_login.game_disk_storage_total = 26628 | |
| major_login.external_sdcard_avail_storage = 32992 | |
| major_login.external_sdcard_total_storage = 36235 | |
| major_login.login_by = 3 | |
| major_login.library_path = "/data/app/com.dts.freefireth-YPKM8jHEwAJlhpmhDhv5MQ==/lib/arm64" | |
| major_login.reg_avatar = 1 | |
| major_login.library_token = "5b892aaabd688e571f688053118a162b|/data/app/com.dts.freefireth-YPKM8jHEwAJlhpmhDhv5MQ==/base.apk" | |
| major_login.channel_type = 3 | |
| major_login.cpu_type = 2 | |
| major_login.cpu_architecture = "64" | |
| major_login.client_version_code = "2019116753" | |
| major_login.graphics_api = "OpenGLES2" | |
| major_login.supported_astc_bitset = 16383 | |
| major_login.login_open_id_type = 4 | |
| major_login.analytics_detail = b"FwQVTgUPX1UaUllDDwcWCRBpWAUOUgsvA1snWlBaO1kFYg==" | |
| major_login.loading_time = 13564 | |
| major_login.release_channel = "android" | |
| major_login.extra_info = "KqsHTymw5/5GB23YGniUYN2/q47GATrq7eFeRatf0NkwLKEMQ0PK5BKEk72dPflAxUlEBir6Vtey83XqF593qsl8hwY=" | |
| major_login.android_engine_init_flag = 110009 | |
| major_login.if_push = 1 | |
| major_login.is_vpn = 1 | |
| major_login.origin_platform_type = "4" | |
| major_login.primary_platform_type = "4" | |
| string = major_login.SerializeToString() | |
| return await encrypted_proto(string) | |
| async def MajorLogin(payload): | |
| url = "https://loginbp.ggblueshark.com/MajorLogin" | |
| ssl_context = ssl.create_default_context() | |
| ssl_context.check_hostname = False | |
| ssl_context.verify_mode = ssl.CERT_NONE | |
| async with aiohttp.ClientSession() as session: | |
| async with session.post(url, data=payload, headers=Hr, ssl=ssl_context) as response: | |
| if response.status == 200: return await response.read() | |
| return None | |
| async def GetLoginData(base_url, payload, token): | |
| url = f"{base_url}/GetLoginData" | |
| ssl_context = ssl.create_default_context() | |
| ssl_context.check_hostname = False | |
| ssl_context.verify_mode = ssl.CERT_NONE | |
| Hr['Authorization']= f"Bearer {token}" | |
| async with aiohttp.ClientSession() as session: | |
| async with session.post(url, data=payload, headers=Hr, ssl=ssl_context) as response: | |
| if response.status == 200: return await response.read() | |
| return None | |
| async def DecRypTMajoRLoGin(MajoRLoGinResPonsE): | |
| proto = MajoRLoGinrEs_pb2.MajorLoginRes() | |
| proto.ParseFromString(MajoRLoGinResPonsE) | |
| return proto | |
| async def DecRypTLoGinDaTa(LoGinDaTa): | |
| proto = PorTs_pb2.GetLoginData() | |
| proto.ParseFromString(LoGinDaTa) | |
| return proto | |
| async def DecodeWhisperMessage(hex_packet): | |
| packet = bytes.fromhex(hex_packet) | |
| proto = DEcwHisPErMsG_pb2.DecodeWhisper() | |
| proto.ParseFromString(packet) | |
| return proto | |
| async def decode_team_packet(hex_packet): | |
| packet = bytes.fromhex(hex_packet) | |
| proto = sQ_pb2.recieved_chat() | |
| proto.ParseFromString(packet) | |
| return proto | |
| async def xAuThSTarTuP(TarGeT, token, timestamp, key, iv): | |
| uid_hex = hex(TarGeT)[2:] | |
| uid_length = len(uid_hex) | |
| encrypted_timestamp = await DecodE_HeX(timestamp) | |
| encrypted_account_token = token.encode().hex() | |
| encrypted_packet = await EnC_PacKeT(encrypted_account_token, key, iv) | |
| encrypted_packet_length = hex(len(encrypted_packet) // 2)[2:] | |
| if uid_length == 9: headers = '0000000' | |
| elif uid_length == 8: headers = '00000000' | |
| elif uid_length == 10: headers = '000000' | |
| elif uid_length == 7: headers = '000000000' | |
| else: print('Unexpected length') ; headers = '0000000' | |
| return f"0115{headers}{uid_hex}{encrypted_timestamp}00000{encrypted_packet_length}{encrypted_packet}" | |
| async def cHTypE(H): | |
| if not H: return 'Squid' | |
| elif H == 1: return 'CLan' | |
| elif H == 2: return 'PrivaTe' | |
| async def SEndMsG(H , message , Uid , chat_id , key , iv): | |
| TypE = await cHTypE(H) | |
| if TypE == 'Squid': msg_packet = await xSEndMsgsQ(message , chat_id , key , iv) | |
| elif TypE == 'CLan': msg_packet = await xSEndMsg(message , 1 , chat_id , chat_id , key , iv) | |
| elif TypE == 'PrivaTe': msg_packet = await xSEndMsg(message , 2 , Uid , Uid , key , iv) | |
| return msg_packet | |
| async def SEndPacKeT(OnLinE , ChaT , TypE , PacKeT): | |
| if TypE == 'ChaT' and ChaT: whisper_writer.write(PacKeT) ; await whisper_writer.drain() | |
| elif TypE == 'OnLine': online_writer.write(PacKeT) ; await online_writer.drain() | |
| else: return 'UnsoPorTed TypE ! >> ErrrroR (:():)' | |
| async def TcPOnLine(ip, port, key_val, iv_val, AutHToKen, reconnect_delay=0.5): | |
| global online_writer, key, iv, team_members_data, current_team_leader | |
| global team_collection_active, previous_team_uids | |
| key = key_val | |
| iv = iv_val | |
| while True: | |
| try: | |
| # Reset team state on new connection | |
| team_members_data = [] | |
| current_team_leader = None | |
| team_collection_active = False | |
| previous_team_uids = set() | |
| reader, writer = await asyncio.open_connection(ip, int(port)) | |
| online_writer = writer | |
| print(f"[ONLINE] Connected to {ip}:{port}") | |
| bytes_payload = bytes.fromhex(AutHToKen) | |
| online_writer.write(bytes_payload) | |
| await online_writer.drain() | |
| while True: | |
| data2 = await reader.read(9999) | |
| if not data2: break | |
| packet_hex = data2.hex() | |
| # Team collection | |
| if packet_hex.startswith('0500') and len(packet_hex) > 1000: | |
| try: | |
| decoded = await DeCode_PackEt(packet_hex[10:]) | |
| parsed = json.loads(decoded) | |
| await collect_team_members_dynamic('0500_LARGE', parsed) | |
| except: | |
| pass | |
| # Your existing chat code | |
| if data2.hex().startswith('0500') and len(data2.hex()) > 1000: | |
| try: | |
| packet = await DeCode_PackEt(data2.hex()[10:]) | |
| packet = json.loads(packet) | |
| OwNer_UiD, CHaT_CoDe, SQuAD_CoDe = await GeTSQDaTa(packet) | |
| JoinCHaT = await AutH_Chat(3, OwNer_UiD, CHaT_CoDe, key, iv) | |
| await SEndPacKeT(whisper_writer, online_writer, 'ChaT', JoinCHaT) | |
| except: | |
| pass | |
| online_writer.close() | |
| await online_writer.wait_closed() | |
| online_writer = None | |
| # Broadcast disconnect | |
| if team_collection_active: | |
| print(f"[TEAM] ✗ Disconnected from team") | |
| broadcast_team_change('team_left', { | |
| 'in_team': False, | |
| 'total_members': 0, | |
| 'members': [] | |
| }) | |
| # Reset state on disconnect | |
| team_members_data = [] | |
| current_team_leader = None | |
| team_collection_active = False | |
| previous_team_uids = set() | |
| except Exception as e: | |
| print(f"[ERROR] {ip}:{port} - {e}") | |
| online_writer = None | |
| # Reset state on error | |
| team_members_data = [] | |
| current_team_leader = None | |
| team_collection_active = False | |
| previous_team_uids = set() | |
| await asyncio.sleep(reconnect_delay) | |
| async def TcPChaT(ip, port, AutHToKen, key_val, iv_val, LoGinDaTaUncRypTinG, ready_event, region_val, reconnect_delay=0.5): | |
| global spam_room, whisper_writer, spammer_uid, spam_chat_id, spam_uid, online_writer, chat_id, XX, uid, Spy, data2, Chat_Leave | |
| global region # API access के लिए | |
| # Update global variables for API | |
| region = region_val | |
| print(region, 'TCP CHAT') | |
| while True: | |
| try: | |
| reader, writer = await asyncio.open_connection(ip, int(port)) | |
| whisper_writer = writer | |
| print(f"[CHAT] Connected to {ip}:{port}") # Debug message | |
| bytes_payload = bytes.fromhex(AutHToKen) | |
| whisper_writer.write(bytes_payload) | |
| await whisper_writer.drain() | |
| ready_event.set() | |
| if LoGinDaTaUncRypTinG.Clan_ID: | |
| clan_id = LoGinDaTaUncRypTinG.Clan_ID | |
| clan_compiled_data = LoGinDaTaUncRypTinG.Clan_Compiled_Data | |
| print('\n - TarGeT BoT in CLan ! ') | |
| print(f' - Clan Uid > {clan_id}') | |
| print(f' - BoT ConnEcTed WiTh CLan ChaT SuccEssFuLy ! ') | |
| pK = await AuthClan(clan_id, clan_compiled_data, key_val, iv_val) | |
| if whisper_writer: | |
| whisper_writer.write(pK) | |
| await whisper_writer.drain() | |
| while True: | |
| data = await reader.read(9999) | |
| if not data: break | |
| if data.hex().startswith("120000"): | |
| msg = await DeCode_PackEt(data.hex()[10:]) | |
| chatdata = json.loads(msg) | |
| try: | |
| response = await DecodeWhisperMessage(data.hex()[10:]) | |
| uid = response.Data.uid | |
| chat_id = response.Data.Chat_ID | |
| XX = response.Data.chat_type | |
| inPuTMsG = response.Data.msg.lower() | |
| except: | |
| response = None | |
| if response: | |
| if inPuTMsG.startswith(("/5")): | |
| try: | |
| dd = chatdata['5']['data']['16'] | |
| print('msg in private') | |
| message = f"[B][C]{get_random_color()}\n\nAccepT My Invitation FasT\n\n" | |
| P = await SEndMsG(response.Data.chat_type, message, uid, chat_id, key_val, iv_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'ChaT', P) | |
| PAc = await OpEnSq(key_val, iv_val, region_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', PAc) | |
| C = await cHSq(5, uid, key_val, iv_val, region_val) | |
| await asyncio.sleep(0.5) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', C) | |
| V = await SEnd_InV(5, uid, key_val, iv_val, region_val) | |
| await asyncio.sleep(0.5) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', V) | |
| E = await ExiT(None, key_val, iv_val) | |
| await asyncio.sleep(3) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', E) | |
| except: | |
| print('msg in squad') | |
| if inPuTMsG.startswith('/x/'): | |
| CodE = inPuTMsG.split('/x/')[1] | |
| try: | |
| dd = chatdata['5']['data']['16'] | |
| print('msg in private') | |
| EM = await GenJoinSquadsPacket(CodE, key_val, iv_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', EM) | |
| except: | |
| print('msg in squad') | |
| if inPuTMsG.startswith('/solo'): | |
| leave = await ExiT(uid, key_val, iv_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', leave) | |
| if inPuTMsG.strip().startswith('/s'): | |
| EM = await FS(key_val, iv_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', EM) | |
| if inPuTMsG.strip().startswith('!e'): | |
| try: | |
| dd = chatdata['5']['data']['16'] | |
| print('msg in private') | |
| message = f"[B][C]{get_random_color()}\n\nCommand Available OnLy In SQuaD ! \n\n" | |
| P = await SEndMsG(response.Data.chat_type, message, uid, chat_id, key_val, iv_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'ChaT', P) | |
| except: | |
| print('msg in squad') | |
| parts = inPuTMsG.strip().split() | |
| print(response.Data.chat_type, uid, chat_id) | |
| message = f'[B][C]{get_random_color()}\nACITVE TarGeT -> {xMsGFixinG(uid)}\n' | |
| P = await SEndMsG(response.Data.chat_type, message, uid, chat_id, key_val, iv_val) | |
| uid2 = uid3 = uid4 = uid5 = None | |
| s = False | |
| try: | |
| uid = int(parts[1]) | |
| uid2 = int(parts[2]) | |
| uid3 = int(parts[3]) | |
| uid4 = int(parts[4]) | |
| uid5 = int(parts[5]) | |
| idT = int(parts[5]) | |
| except ValueError as ve: | |
| print("ValueError:", ve) | |
| s = True | |
| except Exception: | |
| idT = len(parts) - 1 | |
| idT = int(parts[idT]) | |
| print(idT) | |
| print(uid) | |
| if not s: | |
| try: | |
| await SEndPacKeT(whisper_writer, online_writer, 'ChaT', P) | |
| H = await Emote_k(uid, idT, key_val, iv_val, region_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', H) | |
| if uid2: | |
| H = await Emote_k(uid2, idT, key_val, iv_val, region_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', H) | |
| if uid3: | |
| H = await Emote_k(uid3, idT, key_val, iv_val, region_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', H) | |
| if uid4: | |
| H = await Emote_k(uid4, idT, key_val, iv_val, region_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', H) | |
| if uid5: | |
| H = await Emote_k(uid5, idT, key_val, iv_val, region_val) | |
| await SEndPacKeT(whisper_writer, online_writer, 'OnLine', H) | |
| except Exception as e: | |
| pass | |
| whisper_writer.close() | |
| await whisper_writer.wait_closed() | |
| whisper_writer = None | |
| except Exception as e: | |
| print(f"ErroR {ip}:{port} - {e}") | |
| whisper_writer = None | |
| await asyncio.sleep(reconnect_delay) | |
| async def MaiiiinE(): | |
| Uid, Pw = '4564739053','C4699623713B6085801ED5460693D5AF866299004250E4C7F015C46EF879C639' | |
| open_id, access_token = await GeNeRaTeAccEss(Uid, Pw) | |
| if not open_id or not access_token: | |
| print("ErroR - InvaLid AccounT") | |
| return None | |
| PyL = await EncRypTMajoRLoGin(open_id, access_token) | |
| MajoRLoGinResPonsE = await MajorLogin(PyL) | |
| if not MajoRLoGinResPonsE: | |
| print("TarGeT AccounT => BannEd / NoT ReGisTeReD ! ") | |
| return None | |
| MajoRLoGinauTh = await DecRypTMajoRLoGin(MajoRLoGinResPonsE) | |
| UrL = MajoRLoGinauTh.url | |
| print(UrL) | |
| region_val = MajoRLoGinauTh.region | |
| ToKen = MajoRLoGinauTh.token | |
| TarGeT = MajoRLoGinauTh.account_uid | |
| key_val = MajoRLoGinauTh.key | |
| iv_val = MajoRLoGinauTh.iv | |
| timestamp = MajoRLoGinauTh.timestamp | |
| LoGinDaTa = await GetLoginData(UrL, PyL, ToKen) | |
| if not LoGinDaTa: | |
| print("ErroR - GeTinG PorTs From LoGin DaTa !") | |
| return None | |
| LoGinDaTaUncRypTinG = await DecRypTLoGinDaTa(LoGinDaTa) | |
| OnLinePorTs = LoGinDaTaUncRypTinG.Online_IP_Port | |
| ChaTPorTs = LoGinDaTaUncRypTinG.AccountIP_Port | |
| OnLineiP, OnLineporT = OnLinePorTs.split(":") | |
| ChaTiP, ChaTporT = ChaTPorTs.split(":") | |
| acc_name = LoGinDaTaUncRypTinG.AccountName | |
| print(ToKen) | |
| equie_emote(ToKen, UrL) | |
| AutHToKen = await xAuThSTarTuP(int(TarGeT), ToKen, int(timestamp), key_val, iv_val) | |
| ready_event = asyncio.Event() | |
| task1 = asyncio.create_task(TcPChaT(ChaTiP, ChaTporT, AutHToKen, key_val, iv_val, LoGinDaTaUncRypTinG, ready_event, region_val)) | |
| await ready_event.wait() | |
| await asyncio.sleep(1) | |
| task2 = asyncio.create_task(TcPOnLine(OnLineiP, OnLineporT, key_val, iv_val, AutHToKen)) | |
| os.system('clear') | |
| print(render('WINTER', colors=['white', 'green'], align='center')) | |
| print('') | |
| print(f" - BoT STarTinG And OnLine on TarGet : {TarGeT} | BOT NAME : {acc_name}\n") | |
| print(f" - BoT sTaTus > GooD | OnLinE ! (:") | |
| print(f" - Subscribe > MatrixCoder | Gaming ! (:") | |
| await asyncio.gather(task1, task2) | |
| async def StarTinG(): | |
| while True: | |
| try: | |
| await asyncio.wait_for(MaiiiinE(), timeout=7 * 60 * 60) | |
| except asyncio.TimeoutError: | |
| print("Token ExpiRed ! , ResTartinG") | |
| except Exception as e: | |
| print(f"ErroR TcP - {e} => ResTarTinG ...") | |
| if __name__ == '__main__': | |
| asyncio.run(StarTinG()) |