mc5-api-client 1.0.10__py3-none-any.whl → 1.0.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,7 +13,9 @@ Provides easy access to authentication, profile management, clan operations,
13
13
  messaging, and more.
14
14
  """
15
15
 
16
- __version__ = "1.0.10"
16
+ from typing import Optional, Dict, Any
17
+
18
+ __version__ = "1.0.12"
17
19
  __author__ = "Chizoba"
18
20
  __email__ = "chizoba2026@hotmail.com"
19
21
  __license__ = "MIT"
@@ -38,6 +40,57 @@ from .admin_client import (
38
40
  quick_update_player_score
39
41
  )
40
42
 
43
+ # Encrypted token convenience functions
44
+ from .auth import TokenGenerator
45
+
46
+ def quick_generate_encrypted_token(
47
+ username: str,
48
+ password: str,
49
+ device_id: Optional[str] = None,
50
+ scope: str = "alert auth chat leaderboard_ro lobby message session social config storage_ro tracking_bi feed storage leaderboard_admin social_eve social soc transaction schedule lottery voice matchmaker",
51
+ nonce: str = "*"
52
+ ) -> Dict[str, Any]:
53
+ """
54
+ Quick function to generate and encrypt an access token.
55
+
56
+ Args:
57
+ username: MC5 username
58
+ password: Account password
59
+ device_id: Device ID (generated if not provided)
60
+ scope: Permission scopes
61
+ nonce: Nonce value for encryption
62
+
63
+ Returns:
64
+ Dictionary containing encrypted token information
65
+ """
66
+ token_gen = TokenGenerator()
67
+ try:
68
+ result = token_gen.generate_encrypted_token(username, password, device_id, scope, nonce)
69
+ return result
70
+ finally:
71
+ token_gen.close()
72
+
73
+ def quick_encrypt_token(
74
+ access_token: str,
75
+ nonce: str = "*"
76
+ ) -> str:
77
+ """
78
+ Quick function to encrypt an existing access token.
79
+
80
+ Args:
81
+ access_token: Raw access token string
82
+ nonce: Nonce value for encryption
83
+
84
+ Returns:
85
+ Encrypted token string
86
+ """
87
+ token_gen = TokenGenerator()
88
+ try:
89
+ result = token_gen.encrypt_token(access_token, nonce)
90
+ return result
91
+ finally:
92
+ token_gen.close()
93
+
41
94
  __all__ = [
42
95
  "MC5Client",
43
96
  "SimpleMC5Client",
@@ -57,5 +110,7 @@ __all__ = [
57
110
  "RateLimitError",
58
111
  "help",
59
112
  "examples",
60
- "quick_reference"
113
+ "quick_reference",
114
+ "quick_generate_encrypted_token",
115
+ "quick_encrypt_token"
61
116
  ]
mc5_api_client/auth.py CHANGED
@@ -38,6 +38,7 @@ class TokenGenerator:
38
38
  self,
39
39
  client_id: str = "1875:55979:6.0.0a:windows:windows",
40
40
  auth_url: str = "https://eur-janus.gameloft.com:443/authorize",
41
+ encrypt_url: str = "https://eur-janus.gameloft.com/encrypt_token",
41
42
  timeout: int = 30,
42
43
  max_retries: int = 3
43
44
  ):
@@ -47,11 +48,13 @@ class TokenGenerator:
47
48
  Args:
48
49
  client_id: Game client identifier
49
50
  auth_url: Authentication endpoint URL
51
+ encrypt_url: Token encryption endpoint URL
50
52
  timeout: Request timeout in seconds
51
53
  max_retries: Maximum number of retry attempts
52
54
  """
53
55
  self.client_id = client_id
54
56
  self.auth_url = auth_url
57
+ self.encrypt_url = encrypt_url
55
58
  self.timeout = timeout
56
59
  self.max_retries = max_retries
57
60
 
@@ -275,6 +278,95 @@ class TokenGenerator:
275
278
  "signature": parts[6] if len(parts) > 6 else None
276
279
  }
277
280
 
281
+ def encrypt_token(
282
+ self,
283
+ access_token: str,
284
+ nonce: str = "*"
285
+ ) -> str:
286
+ """
287
+ Encrypt an access token for additional security.
288
+
289
+ Args:
290
+ access_token: Raw access token string
291
+ nonce: Nonce value for encryption (default: "*")
292
+
293
+ Returns:
294
+ Encrypted token string
295
+
296
+ Raises:
297
+ AuthenticationError: If encryption fails
298
+ NetworkError: If network issues occur
299
+ """
300
+ payload = {
301
+ "access_token": access_token,
302
+ "nonce": nonce
303
+ }
304
+
305
+ try:
306
+ print("🔐 Encrypting token...")
307
+ response = self.session.post(
308
+ self.encrypt_url,
309
+ data=payload,
310
+ timeout=self.timeout
311
+ )
312
+
313
+ if response.status_code == 200:
314
+ encrypted_token = response.text.strip()
315
+ if encrypted_token:
316
+ print("✅ Token encrypted successfully")
317
+ return encrypted_token
318
+ else:
319
+ raise AuthenticationError("Empty encrypted token response")
320
+ else:
321
+ raise AuthenticationError(
322
+ f"Token encryption failed with status {response.status_code}: {response.text}"
323
+ )
324
+
325
+ except requests.exceptions.Timeout:
326
+ raise NetworkError("Token encryption request timed out")
327
+ except requests.exceptions.ConnectionError:
328
+ raise NetworkError("Failed to connect to encryption server")
329
+ except requests.exceptions.RequestException as e:
330
+ raise NetworkError(f"Network error during token encryption: {e}")
331
+
332
+ def generate_encrypted_token(
333
+ self,
334
+ username: str,
335
+ password: str,
336
+ device_id: Optional[str] = None,
337
+ scope: str = "alert auth chat leaderboard_ro lobby message session social config storage_ro tracking_bi feed storage leaderboard_admin social_eve social soc transaction schedule lottery voice matchmaker",
338
+ nonce: str = "*"
339
+ ) -> Dict[str, Any]:
340
+ """
341
+ Generate and encrypt an access token in one step.
342
+
343
+ Args:
344
+ username: MC5 username
345
+ password: Account password
346
+ device_id: Device ID (generated if not provided)
347
+ scope: Space-separated list of permission scopes
348
+ nonce: Nonce value for encryption (default: "*")
349
+
350
+ Returns:
351
+ Dictionary containing encrypted token information
352
+
353
+ Raises:
354
+ InvalidCredentialsError: If credentials are invalid
355
+ AuthenticationError: If authentication or encryption fails
356
+ NetworkError: If network issues occur
357
+ """
358
+ # First generate regular token
359
+ token_data = self.generate_token(username, password, device_id, scope)
360
+
361
+ # Then encrypt it
362
+ encrypted_token = self.encrypt_token(token_data["access_token"], nonce)
363
+
364
+ # Add encrypted token to result
365
+ token_data["encrypted_token"] = encrypted_token
366
+ token_data["nonce"] = nonce
367
+
368
+ return token_data
369
+
278
370
  def close(self):
279
371
  """Close the HTTP session."""
280
372
  if self.session:
mc5_api_client/cli.py CHANGED
@@ -447,7 +447,7 @@ class MC5CLI:
447
447
 
448
448
  def _print_version(self):
449
449
  """Print version information."""
450
- self._print("MC5 API Client v1.0.10", "cyan")
450
+ self._print("MC5 API Client v1.0.12", "cyan")
451
451
  self._print("The ultimate Modern Combat 5 API library", "green")
452
452
  self._print("Author: Chizoba", "blue")
453
453
  self._print("Email: chizoba2026@hotmail.com", "blue")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mc5_api_client
3
- Version: 1.0.10
3
+ Version: 1.0.12
4
4
  Summary: A comprehensive Python library for interacting with the Modern Combat 5 API
5
5
  Home-page: https://pypi.org/project/mc5-api-client/
6
6
  Author: Chizoba
@@ -108,9 +108,9 @@ Think of this as your remote control for Modern Combat 5! Here's what you can do
108
108
  - ⚡ **One-Liner Functions**: Quick search and kick operations!
109
109
  - 🎯 **User-Friendly**: Designed for beginners and clan leaders!
110
110
  - 🚀 **NEW: Admin Capabilities**: Use admin credentials for enhanced squad management!
111
- - ⭐ **NEW: Squad Rating**: Add 5200+ rating to your squad with admin privileges!
112
111
  - 🎯 **NEW: Player Score Updates**: Update any player's score, XP, and kill signatures!
113
112
  - 🛡️ **NEW: Built-in Help System**: Comprehensive help commands and examples!
113
+ - 🔐 **NEW: Encrypted Token Support**: Generate and encrypt tokens for additional security!
114
114
 
115
115
  ## 🚀 Installation
116
116
 
@@ -122,14 +122,14 @@ pip install mc5_api_client==1.0.8
122
122
 
123
123
  ### ✅ **Major Enhancements Completed!**
124
124
 
125
- **🚀 Advanced Automation Features (NEW in v1.0.8):**
125
+ **🚀 Advanced Automation Features (NEW in v1.0.8+):**
126
126
  - ✅ **AdminMC5Client**: Enhanced client with admin privileges
127
- - ✅ **Squad Rating Management**: Add 5200+ rating to any squad
128
- - ✅ **Player Score Updates**: Update any player's score, XP, and kill signatures
127
+ - ✅ **Player Score Management**: Update individual player scores, XP, and kill signatures
129
128
  - ✅ **Batch Processing**: Search multiple players with loops and conditionals
130
129
  - ✅ **Real-time Monitoring**: Continuous activity tracking with while loops
131
130
  - ✅ **Smart Clan Cleanup**: Intelligent member management with safety features
132
131
  - ✅ **Built-in Help System**: Comprehensive help commands and examples
132
+ - ✅ **Encrypted Token Support**: Generate and encrypt tokens for additional security
133
133
  - ✅ **Production Ready**: Thoroughly tested and verified for production use
134
134
 
135
135
  **🎮 Revolutionary Simple Interface (from v1.0.7):**
@@ -174,12 +174,11 @@ pip install mc5_api_client
174
174
 
175
175
  New in v1.0.8! Powerful admin capabilities for enhanced squad management:
176
176
 
177
- ### **⭐ Add 5200+ Rating to Your Squad**
178
-
177
+ ### **⭐ Update Player Scores (Admin Only):**
179
178
  ```python
180
179
  from mc5_api_client import quick_update_player_score
181
180
 
182
- # Add 5200 rating to your squad by updating your player score
181
+ # Update any player's score, XP, and kill signature
183
182
  result = quick_update_player_score(
184
183
  target_user_id="anonymous:d2luOF92M18xNzcwMDUxNjkwXy7H33aeTVB4YZictyDq48c=",
185
184
  score=5200,
@@ -188,48 +187,47 @@ result = quick_update_player_score(
188
187
  killsig_id="default_killsig_80"
189
188
  )
190
189
 
191
- print(f"✅ Success! Score updated: {result['score_updated']}")
190
+ if result.get('success'):
191
+ print("✅ Player score updated successfully!")
192
+ print(f"New score: {result.get('score')}")
193
+ print(f"New XP: {result.get('xp')}")
192
194
  ```
193
195
 
194
- ### **🛡️ Admin Client Usage**
195
-
196
+ ### **� Admin Client Usage:**
196
197
  ```python
197
198
  from mc5_api_client import create_admin_client
198
199
 
199
- # Create admin client with enhanced privileges
200
+ # Create admin client with elevated privileges
200
201
  client = create_admin_client()
201
202
  client.connect()
202
203
 
203
- # Update any player's score
204
+ # Update player information
204
205
  result = client.update_player_score(
205
206
  target_user_id="player_user_id",
206
207
  score=10000,
207
- xp=5000000
208
+ xp=5000000,
209
+ killsig_color="16777215",
210
+ killsig_id="default_killsig_42"
208
211
  )
209
212
 
210
- # Get squad members
213
+ # Get squad members (if you have access)
211
214
  members = client.get_squad_members()
212
- print(f"Squad has {len(members)} members")
215
+ print(f"Found {len(members)} squad members")
216
+
217
+ # Kick members (if you have permissions)
218
+ # client.kick_member("member_user_id", "Reason for kick")
213
219
 
214
220
  client.close()
215
221
  ```
216
222
 
217
- ### **🎯 Quick Squad Rating**
223
+ ### **⚠️ Important Admin Limitations:**
224
+ - ✅ **Can Update**: Individual player scores, XP, kill signatures
225
+ - ✅ **Can Kick**: Squad members (with proper permissions)
226
+ - ❌ **Cannot Edit**: Squad rating directly (requires squad ownership)
227
+ - ❌ **Cannot Modify**: Squad settings (requires squad ownership)
218
228
 
219
- ```python
220
- from mc5_api_client import quick_add_squad_rating
221
-
222
- # Add rating using admin credentials
223
- result = quick_add_squad_rating(
224
- username="game:mc5_system",
225
- password="admin",
226
- rating=5200,
227
- use_admin=True
228
- )
229
-
230
- if 'error' not in result:
231
- print("✅ 5200 rating added to squad!")
232
- ```
229
+ ### **🔧 How It Actually Works:**
230
+ Admin privileges allow you to modify individual player data within a squad, which indirectly affects the squad's overall rating through the sum of member scores, but you cannot directly set the squad's rating value.
233
231
 
234
232
  ## 🎮 **Simple Usage for Non-Developers**
235
233
 
@@ -400,8 +398,7 @@ client.connect()
400
398
  player = client.search_player('f55f')
401
399
 
402
400
  # 🔹 Admin Operations
403
- quick_update_player_score('user_id', 5200)
404
- quick_add_squad_rating('admin', 'admin', 5200, use_admin=True)
401
+ quick_update_player_score('user_id', 5200, xp=2037745)
405
402
 
406
403
  # 🔹 Error Handling
407
404
  try: except AuthenticationError:
@@ -413,15 +410,16 @@ try: except MC5APIError:
413
410
  ### **🚀 Install from PyPI (Recommended)**
414
411
 
415
412
  ```bash
416
- pip install mc5_api_client==1.0.8
413
+ pip install mc5_api_client==1.0.12
417
414
  ```
418
415
 
419
- ✅ **Published and Available!** The MC5 API Client v1.0.8 is now live on PyPI with advanced automation features and admin capabilities!
416
+ ✅ **Published and Available!** The MC5 API Client v1.0.12 is now live on PyPI with accurate admin capabilities, encrypted token support, and corrected documentation!
420
417
 
421
418
  ### **� Install from Local Package**
422
419
 
423
420
  ```bash
424
421
  # Install the wheel file you just created
422
+ pip install dist/mc5_api_client-1.0.10-py3-none-any.whl
425
423
  pip install dist/mc5_api_client-1.0.8-py3-none-any.whl
426
424
 
427
425
  # Or install from source
@@ -809,7 +807,65 @@ for event in events:
809
807
  print(f" Task {i+1}: {points} points")
810
808
  ```
811
809
 
812
- ### 🏆 Checking Leaderboards
810
+ ### 🔐 **Encrypted Token Support**
811
+
812
+ For users who prefer additional security, the module now supports token encryption:
813
+
814
+ ```python
815
+ from mc5_api_client import quick_generate_encrypted_token, quick_encrypt_token
816
+
817
+ # Generate and encrypt a token in one step
818
+ encrypted_data = quick_generate_encrypted_token(
819
+ username="anonymous:d2luOF92M18xNzcwMDUxNjkwXy7H33aeTVB4YZictyDq48c=",
820
+ password="sSJKzhQ5l4vrFgov",
821
+ nonce="*" # Custom nonce value (optional)
822
+ )
823
+
824
+ print(f"Token ID: {encrypted_data['token_id']}")
825
+ print(f"Encrypted Token: {encrypted_data['encrypted_token']}")
826
+ print(f"Expires: {encrypted_data['expires_at']}")
827
+
828
+ # Encrypt an existing token
829
+ existing_token = "your_raw_access_token_here"
830
+ encrypted_token = quick_encrypt_token(existing_token, "*")
831
+ print(f"Encrypted: {encrypted_token}")
832
+ ```
833
+
834
+ **Advanced TokenGenerator Usage:**
835
+
836
+ ```python
837
+ from mc5_api_client import TokenGenerator
838
+
839
+ # Create token generator with custom settings
840
+ token_gen = TokenGenerator(
841
+ encrypt_url="https://eur-janus.gameloft.com/encrypt_token"
842
+ )
843
+
844
+ try:
845
+ # Generate encrypted token
846
+ result = token_gen.generate_encrypted_token(
847
+ username="anonymous:credential",
848
+ password="password",
849
+ nonce="custom_nonce"
850
+ )
851
+
852
+ # Or encrypt existing token
853
+ encrypted = token_gen.encrypt_token(
854
+ access_token="raw_token",
855
+ nonce="custom_nonce"
856
+ )
857
+
858
+ finally:
859
+ token_gen.close() # Always close the session
860
+ ```
861
+
862
+ **Security Benefits:**
863
+ - ✅ **Additional Layer**: Tokens are encrypted before transmission
864
+ - ✅ **Custom Nonce**: Support for custom nonce values
865
+ - ✅ **Backward Compatible**: Works with existing authentication flow
866
+ - ✅ **Error Handling**: Proper validation and error recovery
867
+
868
+ ### 🏆 **Checking Leaderboards**
813
869
 
814
870
  See how you stack up:
815
871
 
@@ -1,15 +1,15 @@
1
- mc5_api_client/__init__.py,sha256=Tdr0ZbZ85zqOOl7OF0mCs9Lycurv6mOuS9YZfvdc2WM,1712
1
+ mc5_api_client/__init__.py,sha256=Fez2LJHEpim5fUuHFiWa7IdM_nENxWAns6_pVL_k2m8,3296
2
2
  mc5_api_client/admin_client.py,sha256=527aavolxVhY2M5ceFxVbbE5YTczU9Z86Fdt1UzdRZM,15220
3
- mc5_api_client/auth.py,sha256=Yj_6s8KmtbswWbR6q816d8soIirUF2aD_KWxg-jNqR0,9978
4
- mc5_api_client/cli.py,sha256=7_IGHBJmvJPZ3sYpBQK_mqHigGhzW-V4NWKrIpUTAc0,17255
3
+ mc5_api_client/auth.py,sha256=z8vmyQIHUdAzk0pUyKCesT8gTv4jboLIFGBxAu1v_-8,13396
4
+ mc5_api_client/cli.py,sha256=W7d_B8P_7qvvnAe-P3PQ-O6nW0ca7ADV3e9GLgEVylM,17255
5
5
  mc5_api_client/client.py,sha256=q5PkdpTXjWCXdLFiK1-zqa7fThJGE4Z99A3ccMfwJIY,79239
6
6
  mc5_api_client/exceptions.py,sha256=o7od4GrEIlgq6xSNUjZdh74xoDTytF3PLcMq5ewRiJw,2683
7
7
  mc5_api_client/help.py,sha256=sqf3R6VHQuSYLvAMzh8nXAgCX5URsvXydvw8P0ATabg,7246
8
8
  mc5_api_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  mc5_api_client/simple_client.py,sha256=31JI2rURHIXKcnDXQYJNpr-gypweO56ANFdhD-Z4Ft0,20241
10
- mc5_api_client-1.0.10.dist-info/licenses/LICENSE,sha256=M0UBQ4B3pB9XcV54_jhVP681xyauF8GB6YK_rKmuXzk,1064
11
- mc5_api_client-1.0.10.dist-info/METADATA,sha256=a9EbVzcyxNtu2sFJJFzkmnRZ3v9NPvleNyrHcKKiTeg,52876
12
- mc5_api_client-1.0.10.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
13
- mc5_api_client-1.0.10.dist-info/entry_points.txt,sha256=2kruOpleFYK3Jl1MoQwGyqCd-Pj4kQWngXmIjnXx_gE,48
14
- mc5_api_client-1.0.10.dist-info/top_level.txt,sha256=eYJe4ue9j1ig_jFY5Z05mDqpizUEV7TYpk5lBXVd4kA,15
15
- mc5_api_client-1.0.10.dist-info/RECORD,,
10
+ mc5_api_client-1.0.12.dist-info/licenses/LICENSE,sha256=M0UBQ4B3pB9XcV54_jhVP681xyauF8GB6YK_rKmuXzk,1064
11
+ mc5_api_client-1.0.12.dist-info/METADATA,sha256=pG3KizNZF1p2VlhGUn9a0k1E0-TrpSrrgSMsjmJ22po,55250
12
+ mc5_api_client-1.0.12.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
13
+ mc5_api_client-1.0.12.dist-info/entry_points.txt,sha256=2kruOpleFYK3Jl1MoQwGyqCd-Pj4kQWngXmIjnXx_gE,48
14
+ mc5_api_client-1.0.12.dist-info/top_level.txt,sha256=eYJe4ue9j1ig_jFY5Z05mDqpizUEV7TYpk5lBXVd4kA,15
15
+ mc5_api_client-1.0.12.dist-info/RECORD,,