modifyself 0.2.2__tar.gz → 0.2.4__tar.gz

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.
Files changed (51) hide show
  1. {modifyself-0.2.2 → modifyself-0.2.4}/PKG-INFO +1 -1
  2. modifyself-0.2.4/modifyself/components.py +286 -0
  3. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/message.py +1 -8
  4. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself.egg-info/PKG-INFO +1 -1
  5. {modifyself-0.2.2 → modifyself-0.2.4}/pyproject.toml +33 -33
  6. modifyself-0.2.2/modifyself/components.py +0 -0
  7. {modifyself-0.2.2 → modifyself-0.2.4}/LICENSE +0 -0
  8. {modifyself-0.2.2 → modifyself-0.2.4}/README.md +0 -0
  9. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/__init__.py +0 -0
  10. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/activity.py +0 -0
  11. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/client.py +0 -0
  12. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/commands/__init__.py +0 -0
  13. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/commands/checks.py +0 -0
  14. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/commands/cog.py +0 -0
  15. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/commands/context.py +0 -0
  16. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/commands/converters.py +0 -0
  17. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/commands/core.py +0 -0
  18. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/core/bitfield.py +0 -0
  19. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/core/enums.py +0 -0
  20. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/core/mixins.py +0 -0
  21. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/core/snowflake.py +0 -0
  22. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/errors.py +0 -0
  23. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/gateway/__init__.py +0 -0
  24. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/gateway/dispatcher.py +0 -0
  25. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/gateway/heartbeat.py +0 -0
  26. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/gateway/websocket.py +0 -0
  27. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/headers.py +0 -0
  28. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/http/__init__.py +0 -0
  29. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/http/client.py +0 -0
  30. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/http/ratelimit.py +0 -0
  31. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/http/route.py +0 -0
  32. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/interactions.py +0 -0
  33. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/__init__.py +0 -0
  34. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/base.py +0 -0
  35. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/billing.py +0 -0
  36. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/channel.py +0 -0
  37. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/guild.py +0 -0
  38. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/member.py +0 -0
  39. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/relationship.py +0 -0
  40. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/settings.py +0 -0
  41. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/user.py +0 -0
  42. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/models/webhook.py +0 -0
  43. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/state.py +0 -0
  44. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/types.py +0 -0
  45. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/utils.py +0 -0
  46. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself/voice.py +0 -0
  47. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself.egg-info/SOURCES.txt +0 -0
  48. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself.egg-info/dependency_links.txt +0 -0
  49. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself.egg-info/requires.txt +0 -0
  50. {modifyself-0.2.2 → modifyself-0.2.4}/modifyself.egg-info/top_level.txt +0 -0
  51. {modifyself-0.2.2 → modifyself-0.2.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modifyself
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: A clean, pythonic Discord self-bot library
5
5
  Author-email: modifyself <modifyself@example.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,286 @@
1
+ """
2
+ Discord components (buttons, selects, modals).
3
+ """
4
+
5
+ from typing import Optional, List, Dict, Any, Union, Callable, Awaitable
6
+ from enum import IntEnum
7
+ import json
8
+
9
+ class ComponentType(IntEnum):
10
+ ACTION_ROW = 1
11
+ BUTTON = 2
12
+ SELECT_MENU = 3
13
+ TEXT_INPUT = 4
14
+ CHANNEL_SELECT = 5
15
+ ROLE_SELECT = 6
16
+ MENTIONABLE_SELECT = 7
17
+ USER_SELECT = 8
18
+
19
+ class ButtonStyle(IntEnum):
20
+ PRIMARY = 1
21
+ SECONDARY = 2
22
+ SUCCESS = 3
23
+ DANGER = 4
24
+ LINK = 5
25
+
26
+ class TextInputStyle(IntEnum):
27
+ SHORT = 1
28
+ PARAGRAPH = 2
29
+
30
+ class Component:
31
+ def __init__(self, data: dict):
32
+ self.type = data.get("type")
33
+ self._data = data
34
+
35
+ def to_dict(self) -> dict:
36
+ return self._data
37
+
38
+ class Button(Component):
39
+ def __init__(
40
+ self,
41
+ style: Union[ButtonStyle, int] = ButtonStyle.PRIMARY,
42
+ label: Optional[str] = None,
43
+ custom_id: Optional[str] = None,
44
+ url: Optional[str] = None,
45
+ emoji: Optional[Dict[str, Any]] = None,
46
+ disabled: bool = False,
47
+ ):
48
+ data = {
49
+ "type": ComponentType.BUTTON,
50
+ "style": int(style),
51
+ "disabled": disabled,
52
+ }
53
+ if label:
54
+ data["label"] = label
55
+ if custom_id:
56
+ data["custom_id"] = custom_id
57
+ if url:
58
+ data["url"] = url
59
+ if emoji:
60
+ data["emoji"] = emoji
61
+ super().__init__(data)
62
+ self.style = style
63
+ self.label = label
64
+ self.custom_id = custom_id
65
+ self.url = url
66
+ self.emoji = emoji
67
+ self.disabled = disabled
68
+
69
+ @classmethod
70
+ def primary(cls, label: str, custom_id: str, emoji: Optional[Dict[str, Any]] = None) -> "Button":
71
+ return cls(style=ButtonStyle.PRIMARY, label=label, custom_id=custom_id, emoji=emoji)
72
+
73
+ @classmethod
74
+ def secondary(cls, label: str, custom_id: str, emoji: Optional[Dict[str, Any]] = None) -> "Button":
75
+ return cls(style=ButtonStyle.SECONDARY, label=label, custom_id=custom_id, emoji=emoji)
76
+
77
+ @classmethod
78
+ def success(cls, label: str, custom_id: str, emoji: Optional[Dict[str, Any]] = None) -> "Button":
79
+ return cls(style=ButtonStyle.SUCCESS, label=label, custom_id=custom_id, emoji=emoji)
80
+
81
+ @classmethod
82
+ def danger(cls, label: str, custom_id: str, emoji: Optional[Dict[str, Any]] = None) -> "Button":
83
+ return cls(style=ButtonStyle.DANGER, label=label, custom_id=custom_id, emoji=emoji)
84
+
85
+ @classmethod
86
+ def link(cls, label: str, url: str, emoji: Optional[Dict[str, Any]] = None) -> "Button":
87
+ return cls(style=ButtonStyle.LINK, label=label, url=url, emoji=emoji)
88
+
89
+ class SelectOption:
90
+ def __init__(
91
+ self,
92
+ label: str,
93
+ value: str,
94
+ description: Optional[str] = None,
95
+ emoji: Optional[Dict[str, Any]] = None,
96
+ default: bool = False,
97
+ ):
98
+ self.label = label
99
+ self.value = value
100
+ self.description = description
101
+ self.emoji = emoji
102
+ self.default = default
103
+
104
+ def to_dict(self) -> dict:
105
+ data = {"label": self.label, "value": self.value}
106
+ if self.description:
107
+ data["description"] = self.description
108
+ if self.emoji:
109
+ data["emoji"] = self.emoji
110
+ if self.default:
111
+ data["default"] = True
112
+ return data
113
+
114
+ class SelectMenu(Component):
115
+ def __init__(
116
+ self,
117
+ custom_id: str,
118
+ options: List[SelectOption],
119
+ placeholder: Optional[str] = None,
120
+ min_values: int = 1,
121
+ max_values: int = 1,
122
+ disabled: bool = False,
123
+ ):
124
+ data = {
125
+ "type": ComponentType.SELECT_MENU,
126
+ "custom_id": custom_id,
127
+ "options": [opt.to_dict() for opt in options],
128
+ "min_values": min_values,
129
+ "max_values": max_values,
130
+ "disabled": disabled,
131
+ }
132
+ if placeholder:
133
+ data["placeholder"] = placeholder
134
+ super().__init__(data)
135
+ self.custom_id = custom_id
136
+ self.options = options
137
+ self.placeholder = placeholder
138
+ self.min_values = min_values
139
+ self.max_values = max_values
140
+ self.disabled = disabled
141
+
142
+ class ChannelSelect(Component):
143
+ def __init__(
144
+ self,
145
+ custom_id: str,
146
+ placeholder: Optional[str] = None,
147
+ min_values: int = 1,
148
+ max_values: int = 1,
149
+ disabled: bool = False,
150
+ channel_types: Optional[List[int]] = None,
151
+ ):
152
+ data = {
153
+ "type": ComponentType.CHANNEL_SELECT,
154
+ "custom_id": custom_id,
155
+ "min_values": min_values,
156
+ "max_values": max_values,
157
+ "disabled": disabled,
158
+ }
159
+ if placeholder:
160
+ data["placeholder"] = placeholder
161
+ if channel_types:
162
+ data["channel_types"] = channel_types
163
+ super().__init__(data)
164
+
165
+ class RoleSelect(Component):
166
+ def __init__(
167
+ self,
168
+ custom_id: str,
169
+ placeholder: Optional[str] = None,
170
+ min_values: int = 1,
171
+ max_values: int = 1,
172
+ disabled: bool = False,
173
+ ):
174
+ data = {
175
+ "type": ComponentType.ROLE_SELECT,
176
+ "custom_id": custom_id,
177
+ "min_values": min_values,
178
+ "max_values": max_values,
179
+ "disabled": disabled,
180
+ }
181
+ if placeholder:
182
+ data["placeholder"] = placeholder
183
+ super().__init__(data)
184
+
185
+ class MentionableSelect(Component):
186
+ def __init__(
187
+ self,
188
+ custom_id: str,
189
+ placeholder: Optional[str] = None,
190
+ min_values: int = 1,
191
+ max_values: int = 1,
192
+ disabled: bool = False,
193
+ ):
194
+ data = {
195
+ "type": ComponentType.MENTIONABLE_SELECT,
196
+ "custom_id": custom_id,
197
+ "min_values": min_values,
198
+ "max_values": max_values,
199
+ "disabled": disabled,
200
+ }
201
+ if placeholder:
202
+ data["placeholder"] = placeholder
203
+ super().__init__(data)
204
+
205
+ class UserSelect(Component):
206
+ def __init__(
207
+ self,
208
+ custom_id: str,
209
+ placeholder: Optional[str] = None,
210
+ min_values: int = 1,
211
+ max_values: int = 1,
212
+ disabled: bool = False,
213
+ ):
214
+ data = {
215
+ "type": ComponentType.USER_SELECT,
216
+ "custom_id": custom_id,
217
+ "min_values": min_values,
218
+ "max_values": max_values,
219
+ "disabled": disabled,
220
+ }
221
+ if placeholder:
222
+ data["placeholder"] = placeholder
223
+ super().__init__(data)
224
+
225
+ class TextInput(Component):
226
+ def __init__(
227
+ self,
228
+ custom_id: str,
229
+ label: str,
230
+ style: Union[TextInputStyle, int] = TextInputStyle.SHORT,
231
+ placeholder: Optional[str] = None,
232
+ value: Optional[str] = None,
233
+ min_length: Optional[int] = None,
234
+ max_length: Optional[int] = None,
235
+ required: bool = True,
236
+ ):
237
+ data = {
238
+ "type": ComponentType.TEXT_INPUT,
239
+ "custom_id": custom_id,
240
+ "label": label,
241
+ "style": int(style),
242
+ "required": required,
243
+ }
244
+ if placeholder:
245
+ data["placeholder"] = placeholder
246
+ if value:
247
+ data["value"] = value
248
+ if min_length:
249
+ data["min_length"] = min_length
250
+ if max_length:
251
+ data["max_length"] = max_length
252
+ super().__init__(data)
253
+
254
+ class ActionRow:
255
+ def __init__(self, *components: Component):
256
+ self.components = list(components)
257
+
258
+ def add_component(self, component: Component):
259
+ self.components.append(component)
260
+
261
+ def to_dict(self) -> dict:
262
+ return {
263
+ "type": ComponentType.ACTION_ROW,
264
+ "components": [c.to_dict() for c in self.components],
265
+ }
266
+
267
+ class Modal:
268
+ def __init__(
269
+ self,
270
+ custom_id: str,
271
+ title: str,
272
+ components: Optional[List[Component]] = None,
273
+ ):
274
+ self.custom_id = custom_id
275
+ self.title = title
276
+ self.components = components or []
277
+
278
+ def add_component(self, component: Component):
279
+ self.components.append(component)
280
+
281
+ def to_dict(self) -> dict:
282
+ return {
283
+ "custom_id": self.custom_id,
284
+ "title": self.title,
285
+ "components": [ActionRow(c).to_dict() for c in self.components],
286
+ }
@@ -42,14 +42,13 @@ class Message(DiscordObject):
42
42
  "application",
43
43
  "message_reference",
44
44
  "interaction",
45
- "components",
46
45
  "sticker_items",
47
46
  "position",
48
47
  "role_subscription_data",
49
48
  "resolved",
50
49
  "poll",
51
50
  "call",
52
- "author",
51
+ "_components",
53
52
  )
54
53
 
55
54
  def __init__(self, *, state: "ConnectionState", data: dict):
@@ -212,11 +211,5 @@ class Message(DiscordObject):
212
211
  """Unpin this message."""
213
212
  await self._state.http.unpin_message(self.channel_id, self.id)
214
213
 
215
- async def get_reaction_users(self, emoji: str, limit: int = 100) -> List[User]:
216
- """Get users who reacted with a specific emoji."""
217
- # This would need to be implemented in the HTTP client
218
- # For now, just return an empty list
219
- return []
220
-
221
214
  def __repr__(self) -> str:
222
215
  return f"<Message id={self.id} content={self.content[:50]!r}>"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modifyself
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: A clean, pythonic Discord self-bot library
5
5
  Author-email: modifyself <modifyself@example.com>
6
6
  License-Expression: MIT
@@ -1,34 +1,34 @@
1
- [build-system]
2
- requires = ["setuptools>=61.0", "wheel"]
3
- build-backend = "setuptools.build_meta"
4
-
5
- [project]
6
- name = "modifyself"
7
- version = "0.2.2"
8
- description = "A clean, pythonic Discord self-bot library"
9
- readme = "README.md"
10
- license = "MIT"
11
- authors = [
12
- {name = "modifyself", email = "modifyself@example.com"}
13
- ]
14
- requires-python = ">=3.9"
15
- dependencies = [
16
- "websockets>=10.0",
17
- "wreq>=0.1.0",
18
- "aiohttp>=3.8.0",
19
- "plyer>=0.9",
20
- "pillow>=10.0",
21
- "requests>=2.28",
22
- "PyNaCl>=1.5.0",
23
- "opuslib>=3.0.0",
24
- ]
25
-
26
- [project.urls]
27
- Homepage = "https://github.com/clashings/modifyself"
28
- Bug-Reports = "https://github.com/clashings/modifyself/issues"
29
- Source = "https://github.com/clashings/modifyself"
30
-
31
- [tool.setuptools.packages.find]
32
- where = ["."]
33
- include = ["modifyself*"]
1
+ [build-system]
2
+ requires = ["setuptools>=61.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "modifyself"
7
+ version = "0.2.4"
8
+ description = "A clean, pythonic Discord self-bot library"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ authors = [
12
+ {name = "modifyself", email = "modifyself@example.com"}
13
+ ]
14
+ requires-python = ">=3.9"
15
+ dependencies = [
16
+ "websockets>=10.0",
17
+ "wreq>=0.1.0",
18
+ "aiohttp>=3.8.0",
19
+ "plyer>=0.9",
20
+ "pillow>=10.0",
21
+ "requests>=2.28",
22
+ "PyNaCl>=1.5.0",
23
+ "opuslib>=3.0.0",
24
+ ]
25
+
26
+ [project.urls]
27
+ Homepage = "https://github.com/clashings/modifyself"
28
+ Bug-Reports = "https://github.com/clashings/modifyself/issues"
29
+ Source = "https://github.com/clashings/modifyself"
30
+
31
+ [tool.setuptools.packages.find]
32
+ where = ["."]
33
+ include = ["modifyself*"]
34
34
  exclude = ["tests*", "examples*", "docs*"]
File without changes
File without changes
File without changes
File without changes