RubigramClient 1.7.2__py3-none-any.whl → 1.7.3__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.

Potentially problematic release.


This version of RubigramClient might be problematic. Click here for more details.

@@ -1,8 +1,19 @@
1
+ from .on_stop import OnStop
2
+ from .on_start import OnStart
1
3
  from .register import Register
2
4
  from .on_message import OnMessage
5
+ from .on_edit_message import OnEditMessage
6
+ from .on_delete_message import OnDeleteMessage
7
+ from .on_inline_message import OnInlineMessage
8
+
3
9
 
4
10
  class Decorator(
11
+ OnStop,
12
+ OnStart,
5
13
  Register,
6
- OnMessage
14
+ OnMessage,
15
+ OnEditMessage,
16
+ OnDeleteMessage,
17
+ OnInlineMessage
7
18
  ):
8
19
  pass
@@ -0,0 +1 @@
1
+ from .client import Rubino
@@ -0,0 +1,366 @@
1
+ from typing import Optional, Literal, Union
2
+ from .network import Network
3
+ from random import randint
4
+
5
+
6
+ class Rubino(Network):
7
+ def __init__(
8
+ self,
9
+ auth: str,
10
+ timeout: float = 30
11
+ ):
12
+ super().__init__(auth, timeout)
13
+
14
+ def rnd(self):
15
+ return randint(100000, 999999999)
16
+
17
+ async def app_post(
18
+ self,
19
+ file: str,
20
+ caption: Optional[str] = None,
21
+ post_type: Literal["Picture", "Video"] = "Picture",
22
+ profile_id: Optional[str] = None,
23
+ file_name: Optional[str] = None,
24
+ is_multi_file: Optional[str] = None,
25
+ ):
26
+ request = await self.requestUpload(file, post_type, file_name, profile_id)
27
+ file_id, hash_file_receive = request["file_id"], request["hash_file_receive"]
28
+ data = {
29
+ "caption": caption,
30
+ "file_id": file_id,
31
+ "hash_file_receive": hash_file_receive,
32
+ "height": 800,
33
+ "width": 800,
34
+ "is_multi_file": is_multi_file,
35
+ "post_type": post_type,
36
+ "rnd": self.rnd(),
37
+ "thumbnail_file_id": file_id,
38
+ "thumbnail_hash_file_receive": hash_file_receive,
39
+ "profile_id": profile_id
40
+ }
41
+ return await self.request("addPost", data)
42
+
43
+ async def get_post_by_share_link(self, post_link: str):
44
+ return await self.request("getPostByShareLink", {"share_string": post_link.split("/")[-1]})
45
+
46
+ async def add_post_view_count(self, post_id: str, post_profile_id: str):
47
+ data = {"post_id": post_id, "post_profile_id": post_profile_id}
48
+ return await self.request("addPostViewCount", data)
49
+
50
+ async def add_view_story(self, story_profile_id: str, story_ids: Union[str, list[str]], profile_id: Optional[str] = None):
51
+ story_ids = story_ids if isinstance(story_ids, list) else [story_ids]
52
+ data = {
53
+ "story_profile_id": story_profile_id,
54
+ "story_ids": story_ids,
55
+ "profile_id": profile_id
56
+ }
57
+ return await self.request("addViewStory", data)
58
+
59
+ async def is_exist_username(self, username: str):
60
+ return await self.request("isExistUsername", {"username": username.replace("@", "")})
61
+
62
+ async def create_page(self, username: str, name: str, bio: Optional[str] = None):
63
+ return await self.request("createPage", {"username": username, "name": name, "bio": bio})
64
+
65
+ async def add_comment(self, content: str, post_id: str, post_profile_id: str, profile_id: Optional[str] = None):
66
+ data = {
67
+ "content": content,
68
+ "post_id": post_id,
69
+ "post_profile_id": post_profile_id,
70
+ "profile_id": profile_id,
71
+ "rnd": self.rnd()
72
+ }
73
+ return await self.request("addComment", data)
74
+
75
+ async def request_follow(self, followee_id: str, f_type: Literal["Follow", "Unfollow"] = "Follow", profile_id: Optional[str] = None):
76
+ data = {
77
+ "f_type": f_type,
78
+ "followee_id": followee_id,
79
+ "profile_id": profile_id
80
+ }
81
+ return self.request("requestFollow", data)
82
+
83
+ async def follow(self, followee_id: str, profile_id: Optional[str] = None):
84
+ return await self.request_follow(followee_id, "Follow", profile_id)
85
+
86
+ async def unfollow(self, followee_id: str, profile_id: Optional[str] = None):
87
+ return await self.request_follow(followee_id, "Unfollow", profile_id)
88
+
89
+ async def set_block_profile(self, block_id: str, action: Literal["Block", "Unblock"] = "Block", profile_id: Optional[str] = None):
90
+ data = {
91
+ "block_id": block_id,
92
+ "action": action,
93
+ "profile_id": profile_id
94
+ }
95
+ return self.request("setBlockProfile", data)
96
+
97
+ async def block_profile(self, block_id: str, profile_id: Optional[str] = None):
98
+ return await self.set_block_profile(block_id, "Block", profile_id)
99
+
100
+ async def unblock_profile(self, block_id: str, profile_id: Optional[str] = None):
101
+ return await self.set_block_profile(block_id, "Unblock", profile_id)
102
+
103
+ async def get_comments(self, post_id: str, post_profile_id: str, limit: Optional[int] = 100, profile_id: Optional[str] = None):
104
+ data = {
105
+ "post_id": post_id,
106
+ "post_profile_id": post_profile_id,
107
+ "limit": limit,
108
+ "profile_id": profile_id,
109
+ "equal": False,
110
+ "sort": "FromMax"
111
+ }
112
+ return await self.request("getComments", data)
113
+
114
+ async def get_my_profile_info(self, profile_id: Optional[str] = None):
115
+ return await self.request("getMyProfileInfo", {"profile_id": profile_id})
116
+
117
+ async def get_profile_list(self, limit: Optional[int] = 10):
118
+ data = {
119
+ "limit": limit,
120
+ "equal": False,
121
+ "sort": "FromMax"
122
+ }
123
+ return await self.request("getProfileList", data)
124
+
125
+ async def get_profile_stories(self, profile_id: Optional[str] = None, limit: Optional[int] = 10):
126
+ return self.request("getProfileStories", {"limit": limit, "profile_id": profile_id})
127
+
128
+ async def get_recent_following_posts(self, profile_id: Optional[str] = None, limit: Optional[int] = 10):
129
+ data = {
130
+ "limit": limit,
131
+ "equal": False,
132
+ "sort": "FromMax",
133
+ "profile_id": profile_id
134
+ }
135
+ return await self.request("getRecentFollowingPosts", data)
136
+
137
+ async def get_share_link(self, post_id: str, target_profile_id: str, profile_id: Optional[str] = None):
138
+ return await self.request("getShareLink", {"post_id": post_id, "target_profile_id": target_profile_id, "profile_id": profile_id})
139
+
140
+ async def get_story_id(self, post_profile_id: str, profile_id: Optional[str] = None):
141
+ return await self.request("getStoryIds", {"post_profile_id": post_profile_id, "profile_id": profile_id})
142
+
143
+ async def save_post(self, post_id: str, target_profile_id: str, profile_id: Optional[str] = None):
144
+ data = {
145
+ "action_type": "Bookmark",
146
+ "post_id": post_id,
147
+ "target_profile_id": target_profile_id,
148
+ "profile_id": profile_id
149
+ }
150
+ return await self.request("postBookmarkAction", data)
151
+
152
+ async def unsave_post(self, post_id: str, post_profile_id: str, profile_id: Optional[str] = None):
153
+ data = {
154
+ "action_type": "Unbookmark",
155
+ "post_id": post_id,
156
+ "post_profile_id": post_profile_id,
157
+ "profile_id": profile_id
158
+ }
159
+ return await self.request("postBookmarkAction", data)
160
+
161
+ async def update_profile(self, profile_id: Optional[str] = None):
162
+ data = {
163
+ "profile_id": profile_id,
164
+ "profile_status": "Public"
165
+ }
166
+ return await self.request("updateProfile", data)
167
+
168
+ async def like_post(self, post_id: str, target_profile_id: str, profile_id: Optional[str] = None):
169
+ data = {
170
+ "action_type": "Like",
171
+ "post_id": post_id,
172
+ "target_profile_id": target_profile_id,
173
+ "profile_id": profile_id
174
+ }
175
+ return await self.request("likePostAction", data)
176
+
177
+ async def unlike_post(self, post_id: str, target_profile_id: str, profile_id: Optional[str] = None):
178
+ data = {
179
+ "action_type": "Unlike",
180
+ "post_id": post_id,
181
+ "target_profile_id": target_profile_id,
182
+ "profile_id": profile_id
183
+ }
184
+ return await self.request("likePostAction", data)
185
+
186
+ async def like_comment(self, comment_id: str, post_id: str, profile_id: Optional[str] = None):
187
+ data = {
188
+ "action_type": "Like",
189
+ "comment_id": comment_id,
190
+ "post_id": post_id,
191
+ "profile_id": profile_id
192
+ }
193
+ return await self.request("likeCommentAction", data)
194
+
195
+ async def unlike_comment(self, comment_id: str, post_id: str, profile_id: Optional[str] = None):
196
+ data = {
197
+ "action_type": "Unlike",
198
+ "comment_id": comment_id,
199
+ "post_id": post_id,
200
+ "profile_id": profile_id
201
+ }
202
+ return await self.request("likeCommentAction", data)
203
+
204
+ async def get_saved_posts(self, limit: int = 10, profile_id: Optional[str] = None):
205
+ data = {
206
+ "equal": False,
207
+ "limit": limit,
208
+ "sort": "FromMax",
209
+ "profile_id": profile_id
210
+ }
211
+ return await self.request("getBookmarkedPosts", data)
212
+
213
+ async def get_archive_stories(self, limit: int = 10, start_id: Optional[str] = None, profile_id: Optional[str] = None):
214
+ data = {
215
+ "equal": False,
216
+ "limit": limit,
217
+ "start_id": start_id,
218
+ "sort": "FromMax",
219
+ "profile_id": profile_id
220
+ }
221
+ return await self.request("getMyArchiveStories", data)
222
+
223
+ async def get_profile_highlights(self, target_profile_id: str, limit: int = 10, profile_id: Optional[str] = None):
224
+ data = {
225
+ "equal": False,
226
+ "limit": limit,
227
+ "sort": "FromMax",
228
+ "target_profile_id": target_profile_id,
229
+ "profile_id": profile_id
230
+ }
231
+ return await self.request("getProfileHighlights", data)
232
+
233
+ async def get_blocked_profiles(self, limit: int = 50, max_id: Optional[str] = None, profile_id: Optional[str] = None):
234
+ data = {
235
+ "equal": False,
236
+ "limit": limit,
237
+ "max_id": max_id,
238
+ "sort": "FromMax",
239
+ "profile_id": profile_id
240
+ }
241
+ return await self.request("getBlockedProfiles", data)
242
+
243
+ async def get_profile_following(self, target_profile_id: str, limit: int = 50, profile_id: Optional[str] = None):
244
+ data = {
245
+ "equal": False,
246
+ "f_type": "Following",
247
+ "limit": limit,
248
+ "sort": "FromMax",
249
+ "target_profile_id": target_profile_id,
250
+ "profile_id": profile_id
251
+ }
252
+ return await self.request("getProfileFollowers", data)
253
+
254
+ async def get_profile_followers(self, target_profile_id: str, limit: int = 50, profile_id: Optional[str] = None):
255
+ data = {
256
+ "equal": False,
257
+ "f_type": "Follower",
258
+ "limit": limit,
259
+ "sort": "FromMax",
260
+ "target_profile_id": target_profile_id,
261
+ "profile_id": profile_id
262
+ }
263
+ return await self.request("getProfileFollowers", data)
264
+
265
+ async def get_my_stories_list(self, limit: Optional[int] = None, profile_id: Optional[str] = None):
266
+ data = {
267
+ "limit": limit,
268
+ "profile_id": profile_id
269
+ }
270
+ return await self.request("getMyStoriesList", data)
271
+
272
+ async def delete_story(self, story_id: str, profile_id: Optional[str] = None):
273
+ data = {
274
+ "profile_id": profile_id,
275
+ "story_id": story_id
276
+ }
277
+ return await self.request("deleteStory", data)
278
+
279
+ async def get_explore_posts(self, topic_id: str, limit: int = 50, max_id: Optional[str] = None, profile_id: Optional[str] = None):
280
+ data = {
281
+ "equal": False,
282
+ "limit": limit,
283
+ "max_id": max_id,
284
+ "sort": "FromMax",
285
+ "topic_id": topic_id,
286
+ "profile_id": profile_id
287
+ }
288
+ return await self.request("getExplorePosts", data)
289
+
290
+ async def search_profile(self, username: str, limit: int = 50, profile_id: Optional[str] = None):
291
+ data = {
292
+ "equal": False,
293
+ "limit": limit,
294
+ "sort": "FromMax",
295
+ "username": username.replace("@", ""),
296
+ "profile_id": profile_id
297
+ }
298
+ return await self.request("searchProfile", data)
299
+
300
+ async def search_in_rubino(self, username: str, limit: int = 50, profile_id: Optional[str] = None):
301
+ data = {
302
+ "equal": False,
303
+ "limit": limit,
304
+ "sort": "FromMax",
305
+ "username": username.startswith("@"),
306
+ "profile_id": profile_id
307
+ }
308
+ return await self.request("searchProfile", data)
309
+
310
+ async def get_hashtag_trend(self, limit: int = 50, profile_id: Optional[str] = None):
311
+ data = {
312
+ "equal": False,
313
+ "limit": limit,
314
+ "sort": "FromMax",
315
+ "profile_id": profile_id
316
+ }
317
+ return await self.request("getHashTagTrend", data)
318
+
319
+ async def search_hashtag(self, content: str, limit: int = 50, profile_id: Optional[str] = None):
320
+ data = {
321
+ "content": content,
322
+ "equal": False,
323
+ "limit": limit,
324
+ "sort": "FromMax",
325
+ "profile_id": profile_id
326
+ }
327
+ return await self.request("searchHashTag", data)
328
+
329
+ async def get_posts_by_hashtag(self, hashtag: str, limit: int = 50, profile_id: Optional[str] = None):
330
+ data = {
331
+ "equal": False,
332
+ "hashtag": hashtag,
333
+ "limit": limit,
334
+ "profile_id": profile_id
335
+ }
336
+ return await self.request("getPostsByHashTag", data)
337
+
338
+ async def remove_page(self, profile_id: str, record_id: str):
339
+ data = {
340
+ "model": "Profile",
341
+ "record_id": record_id,
342
+ "profile_id": profile_id
343
+ }
344
+ return await self.request("removeRecord", data)
345
+
346
+ async def get_new_follow_requests(self, profile_id: Optional[str] = None, limit: Optional[int] = 20):
347
+ data = {
348
+ "profile_id": profile_id,
349
+ "limit": limit,
350
+ "sort": "FromMax"
351
+ }
352
+ return await self.request("getNewFollowRequests", data)
353
+
354
+ async def action_on_request(self, request_id: str, profile_id: Optional[str] = None, action: Literal["Accept", "Decline"] = "Accept"):
355
+ data = {
356
+ "action": action,
357
+ "request_id": request_id,
358
+ "profile_id": profile_id
359
+ }
360
+ return await self.request("actionOnRequest", data)
361
+
362
+ async def accept_request(self, request_id: str, profile_id: Optional[str] = None):
363
+ return await self.action_on_request(request_id, profile_id)
364
+
365
+ async def reject_request(self, request_id: str, profile_id: Optional[str] = None):
366
+ return await self.action_on_request(request_id, profile_id, "Decline")
@@ -0,0 +1,121 @@
1
+ from typing import Optional, Any
2
+ from aiohttp import FormData
3
+ from ..http import Http
4
+ from urllib.parse import urlparse
5
+ from random import randint
6
+ from pathlib import Path
7
+ from json import loads
8
+ import os
9
+
10
+
11
+ class Network:
12
+ def __init__(
13
+ self,
14
+ auth: str,
15
+ timeout: Optional[float] = 30
16
+ ):
17
+ self.auth = auth
18
+ self.http = Http(timeout)
19
+ self.api = f"https://rubino{randint(1, 30)}.iranlms.ir"
20
+ self.client = {
21
+ "app_name": "Main",
22
+ "app_version": "3.0.2",
23
+ "lang_code": "fa",
24
+ "package": "app.rbmain.a",
25
+ "platform": "Android"
26
+ }
27
+
28
+ async def start(self):
29
+ await self.http.connect()
30
+
31
+ async def stop(self):
32
+ await self.http.disconnect()
33
+
34
+ async def __aenter__(self):
35
+ await self.start()
36
+ return self
37
+
38
+ async def __aexit__(self, *args):
39
+ await self.stop()
40
+
41
+ async def request(self, method: str, data: dict[str, Any]):
42
+ json = {
43
+ "api_version": "0",
44
+ "auth": self.auth,
45
+ "client": self.client,
46
+ "data": data,
47
+ "method": method
48
+ }
49
+ async with self.http.session.post(self.api, json=json) as response:
50
+ response.raise_for_status()
51
+ return await response.json()
52
+
53
+ async def getBytes(self, url: str) -> bytes:
54
+ async with self.http.session.get(url) as response:
55
+ response.raise_for_status()
56
+ return await response.read()
57
+
58
+ async def getName(self, url: str) -> str:
59
+ parser = urlparse(url)
60
+ return os.path.basename(parser.path)
61
+
62
+ async def request_upload_file(
63
+ self,
64
+ file_name: str,
65
+ file_size: str,
66
+ file_type: str,
67
+ profile_id: str,
68
+ ):
69
+ data = {
70
+ "file_name": file_name,
71
+ "file_size": file_size,
72
+ "file_type": file_type,
73
+ "profile_id": profile_id,
74
+ }
75
+ return await self.request("requestUploadFile", data)
76
+
77
+ async def requestUpload(
78
+ self,
79
+ file: str,
80
+ file_type: str,
81
+ file_name: Optional[str] = None,
82
+ profile_id: Optional[str] = None,
83
+ ):
84
+ path = Path(file)
85
+ if path.is_file():
86
+ data = path.read_bytes()
87
+ file_name = file_name if file_name else path.name
88
+ file_size = path.stat().st_size
89
+
90
+ elif file.startswith("http"):
91
+ data = await self.getBytes(file)
92
+ file_name = file_name if file_name else await self.getName(file)
93
+ file_size = len(data)
94
+
95
+ else:
96
+ raise Exception(f"Can't find this file : {file}")
97
+
98
+ request = await self.request_upload_file(file_name, file_size, file_type, profile_id)
99
+ request: dict[str, str] = request["data"]
100
+
101
+ file_id: str = request["file_id"]
102
+ hash_file_request: str = request["hash_file_request"]
103
+ server_url: str = request["server_url"]
104
+
105
+ headers = {
106
+ "auth": self.auth,
107
+ "chunk-size": str(file_size),
108
+ "file-id": file_id,
109
+ "hash-file-request": hash_file_request,
110
+ "content-length": str(file_size),
111
+ "part-number": "1",
112
+ "total-part": "1"
113
+ }
114
+ form = FormData()
115
+ form.add_field(
116
+ "file", data, filename=file_name, content_type="application/octet-stream"
117
+ )
118
+ async with self.http.session.post(server_url, data=form, headers=headers) as response:
119
+ text = await response.text()
120
+ hash_file_receive = loads(text)["data"]["hash_file_receive"]
121
+ return {"file_id": file_id, "hash_file_receive": hash_file_receive}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: RubigramClient
3
- Version: 1.7.2
3
+ Version: 1.7.3
4
4
  Summary: A simple and flexible Python library for building advanced Rubika bots with powerful message handling, inline buttons, and custom filters.
5
5
  Author-email: Javad <MrJavad.Email@gmail.com>
6
6
  License: MIT License
@@ -24,7 +24,7 @@ License: MIT License
24
24
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
26
  SOFTWARE.
27
- Project-URL: Homepage, https://github.com/Javad-RZ/rubigram
27
+ Project-URL: GitHub, https://github.com/Javad-RZ/rubigram
28
28
  Classifier: Programming Language :: Python :: 3
29
29
  Classifier: License :: OSI Approved :: MIT License
30
30
  Classifier: Operating System :: OS Independent
@@ -11,7 +11,7 @@ rubigram/method/chat/__init__.py,sha256=96XDMbiM8EtjsN5mflWNJYwwR5kEXUQHYnXgDG38
11
11
  rubigram/method/chat/get_chat.py,sha256=13ya3lsZXVlRKCHRprMQVpW3ulhyCJVJvcDlApQFsfI,782
12
12
  rubigram/method/chat/get_me.py,sha256=TB5SrB76ipJKN5xvFB5IXSzHV2fpzjIwm14mV4GoXi4,749
13
13
  rubigram/method/chat/get_update.py,sha256=1DTZA8tY1xn-5f13hnvruuF7NfQeYi6gWlF9E5_HL9U,1158
14
- rubigram/method/decorator/__init__.py,sha256=4t4VbkZvoywmWZDeumU40WAXFdAzTT3_dsyld5biXNE,129
14
+ rubigram/method/decorator/__init__.py,sha256=rdBWElrecWRnHXTPV1E5Y0zmnG14xU0nKtYmgNfmQso,422
15
15
  rubigram/method/decorator/on_delete_message.py,sha256=X4FQ4qtu_HcLGrgvB2Bx-PmjD-XeDh3zuc9IzJUhCJY,1407
16
16
  rubigram/method/decorator/on_edit_message.py,sha256=paxlFV5huK7QShZP6M41WsjCPUS_Wj2RGp9hBrkapkM,1382
17
17
  rubigram/method/decorator/on_inline_message.py,sha256=GByo-f4LsdHD9Iai-4VlEP2tnFU9-qljB9VP363ggW0,1455
@@ -56,13 +56,16 @@ rubigram/method/utilities/__init__.py,sha256=F098uwyxCHhtfxgvQnCzS4GTPywMlFbPdWH
56
56
  rubigram/method/utilities/dispatch.py,sha256=f30aBDwcfYig4HFQ88msdtIZVcpm0YFWQL5KkFk7K-A,805
57
57
  rubigram/method/utilities/setup_endpoint.py,sha256=BypRjeg4ECX6xf72-mNZ6DTW99GVRlwAIPeZJ9Dycmo,539
58
58
  rubigram/method/utilities/updater.py,sha256=bGmu7PdFDRYAWckPXCAjtS0M-3DcOO8zB4draVDp_2Q,438
59
+ rubigram/rubino/__init__.py,sha256=6-ztB6rLeIB3SV4tbVPPUxmNqHQUYQhDee6bnNQdECw,26
60
+ rubigram/rubino/client.py,sha256=XWy4cg_Lc96eRsy8OYPffyGktiMkS7yfG4ackY226Ls,14563
61
+ rubigram/rubino/network.py,sha256=13EH4GpBEUZwRLOjJKw5_1MY_5METcqb5qK_F5NBxIE,3814
59
62
  rubigram/types/__init__.py,sha256=i5VL2yv2HlyQdQdx2Qxv0Y3luT5GYVnYuI5Vm7MtvSg,69
60
63
  rubigram/types/messages.py,sha256=Go5LVw9kX-7FrxRpxK3S2sS-427zCbtg_2Q3CNdZc-0,5744
61
64
  rubigram/types/object.py,sha256=UhzOrPTsLrLv9pWVwiyWbaXqwAeNJczQ0cBsf0bHPU0,4139
62
65
  rubigram/types/types.py,sha256=ti-JGIxhEvjl8hwfIucJkW_PDorh2gDCDUtVMYofT78,5744
63
66
  rubigram/types/updates.py,sha256=HDAJaA8bg9GwbGXSDSwAZ5JFyDwAhVxAXByv4pIGvGA,23624
64
- rubigramclient-1.7.2.dist-info/licenses/LICENSE,sha256=W2bekuLJMG2c-8SvTkJflMF5wY_Mx6rsXfXoCQvRzOI,1081
65
- rubigramclient-1.7.2.dist-info/METADATA,sha256=W9_gUkK4KnNWXLDFEqDxN5MV_WgEd6Phk2m4lHX10nI,4550
66
- rubigramclient-1.7.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
67
- rubigramclient-1.7.2.dist-info/top_level.txt,sha256=Mhg5HfkL6rLec5sI4ClGmwoqYUANAZUz8sVa1sT_cas,9
68
- rubigramclient-1.7.2.dist-info/RECORD,,
67
+ rubigramclient-1.7.3.dist-info/licenses/LICENSE,sha256=W2bekuLJMG2c-8SvTkJflMF5wY_Mx6rsXfXoCQvRzOI,1081
68
+ rubigramclient-1.7.3.dist-info/METADATA,sha256=rk4PpagEUSiZiTTjdRuePPg5jgAxdVWg5gGv6boyC2A,4548
69
+ rubigramclient-1.7.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
+ rubigramclient-1.7.3.dist-info/top_level.txt,sha256=Mhg5HfkL6rLec5sI4ClGmwoqYUANAZUz8sVa1sT_cas,9
71
+ rubigramclient-1.7.3.dist-info/RECORD,,