First pass at supporting v8 API
This commit is contained in:
parent
7f91ae8b67
commit
d85805ab6d
@ -153,11 +153,14 @@ class PrivateChannel(Snowflake, Protocol):
|
|||||||
class _Overwrites:
|
class _Overwrites:
|
||||||
__slots__ = ('id', 'allow', 'deny', 'type')
|
__slots__ = ('id', 'allow', 'deny', 'type')
|
||||||
|
|
||||||
|
ROLE = 0
|
||||||
|
MEMBER = 1
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
self.id = kwargs.pop('id')
|
self.id = kwargs.pop('id')
|
||||||
self.allow = int(kwargs.pop('allow_new', 0))
|
self.allow = int(kwargs.pop('allow', 0))
|
||||||
self.deny = int(kwargs.pop('deny_new', 0))
|
self.deny = int(kwargs.pop('deny', 0))
|
||||||
self.type = sys.intern(kwargs.pop('type'))
|
self.type = kwargs.pop('type')
|
||||||
|
|
||||||
def _asdict(self):
|
def _asdict(self):
|
||||||
return {
|
return {
|
||||||
@ -167,6 +170,12 @@ class _Overwrites:
|
|||||||
'type': self.type,
|
'type': self.type,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def is_role(self) -> bool:
|
||||||
|
return self.type == 0
|
||||||
|
|
||||||
|
def is_member(self) -> bool:
|
||||||
|
return self.type == 1
|
||||||
|
|
||||||
|
|
||||||
class GuildChannel(Protocol):
|
class GuildChannel(Protocol):
|
||||||
"""An ABC that details the common operations on a Discord guild channel.
|
"""An ABC that details the common operations on a Discord guild channel.
|
||||||
@ -289,9 +298,9 @@ class GuildChannel(Protocol):
|
|||||||
}
|
}
|
||||||
|
|
||||||
if isinstance(target, Role):
|
if isinstance(target, Role):
|
||||||
payload['type'] = 'role'
|
payload['type'] = _Overwrites.ROLE
|
||||||
else:
|
else:
|
||||||
payload['type'] = 'member'
|
payload['type'] = _Overwrites.MEMBER
|
||||||
|
|
||||||
perms.append(payload)
|
perms.append(payload)
|
||||||
options['permission_overwrites'] = perms
|
options['permission_overwrites'] = perms
|
||||||
@ -318,7 +327,7 @@ class GuildChannel(Protocol):
|
|||||||
overridden_id = int(overridden.pop('id'))
|
overridden_id = int(overridden.pop('id'))
|
||||||
self._overwrites.append(_Overwrites(id=overridden_id, **overridden))
|
self._overwrites.append(_Overwrites(id=overridden_id, **overridden))
|
||||||
|
|
||||||
if overridden['type'] == 'member':
|
if overridden['type'] == _Overwrites.MEMBER:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if overridden_id == everyone_id:
|
if overridden_id == everyone_id:
|
||||||
@ -340,7 +349,7 @@ class GuildChannel(Protocol):
|
|||||||
their default values in the :attr:`~discord.Guild.roles` attribute."""
|
their default values in the :attr:`~discord.Guild.roles` attribute."""
|
||||||
ret = []
|
ret = []
|
||||||
g = self.guild
|
g = self.guild
|
||||||
for overwrite in filter(lambda o: o.type == 'role', self._overwrites):
|
for overwrite in filter(lambda o: o.is_role(), self._overwrites):
|
||||||
role = g.get_role(overwrite.id)
|
role = g.get_role(overwrite.id)
|
||||||
if role is None:
|
if role is None:
|
||||||
continue
|
continue
|
||||||
@ -376,9 +385,9 @@ class GuildChannel(Protocol):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if isinstance(obj, User):
|
if isinstance(obj, User):
|
||||||
predicate = lambda p: p.type == 'member'
|
predicate = lambda p: p.is_member()
|
||||||
elif isinstance(obj, Role):
|
elif isinstance(obj, Role):
|
||||||
predicate = lambda p: p.type == 'role'
|
predicate = lambda p: p.is_role()
|
||||||
else:
|
else:
|
||||||
predicate = lambda p: True
|
predicate = lambda p: True
|
||||||
|
|
||||||
@ -409,9 +418,9 @@ class GuildChannel(Protocol):
|
|||||||
deny = Permissions(ow.deny)
|
deny = Permissions(ow.deny)
|
||||||
overwrite = PermissionOverwrite.from_pair(allow, deny)
|
overwrite = PermissionOverwrite.from_pair(allow, deny)
|
||||||
|
|
||||||
if ow.type == 'role':
|
if ow.is_role():
|
||||||
target = self.guild.get_role(ow.id)
|
target = self.guild.get_role(ow.id)
|
||||||
elif ow.type == 'member':
|
elif ow.is_member():
|
||||||
target = self.guild.get_member(ow.id)
|
target = self.guild.get_member(ow.id)
|
||||||
|
|
||||||
# TODO: There is potential data loss here in the non-chunked
|
# TODO: There is potential data loss here in the non-chunked
|
||||||
@ -513,7 +522,7 @@ class GuildChannel(Protocol):
|
|||||||
|
|
||||||
# Apply channel specific role permission overwrites
|
# Apply channel specific role permission overwrites
|
||||||
for overwrite in remaining_overwrites:
|
for overwrite in remaining_overwrites:
|
||||||
if overwrite.type == 'role' and roles.has(overwrite.id):
|
if overwrite.is_role() and roles.has(overwrite.id):
|
||||||
denies |= overwrite.deny
|
denies |= overwrite.deny
|
||||||
allows |= overwrite.allow
|
allows |= overwrite.allow
|
||||||
|
|
||||||
@ -521,7 +530,7 @@ class GuildChannel(Protocol):
|
|||||||
|
|
||||||
# Apply member specific permission overwrites
|
# Apply member specific permission overwrites
|
||||||
for overwrite in remaining_overwrites:
|
for overwrite in remaining_overwrites:
|
||||||
if overwrite.type == 'member' and overwrite.id == member.id:
|
if overwrite.is_member() and overwrite.id == member.id:
|
||||||
base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny)
|
base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny)
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -632,9 +641,9 @@ class GuildChannel(Protocol):
|
|||||||
http = self._state.http
|
http = self._state.http
|
||||||
|
|
||||||
if isinstance(target, User):
|
if isinstance(target, User):
|
||||||
perm_type = 'member'
|
perm_type = _Overwrites.MEMBER
|
||||||
elif isinstance(target, Role):
|
elif isinstance(target, Role):
|
||||||
perm_type = 'role'
|
perm_type = _Overwrites.ROLE
|
||||||
else:
|
else:
|
||||||
raise InvalidArgument('target parameter must be either Member or Role')
|
raise InvalidArgument('target parameter must be either Member or Role')
|
||||||
|
|
||||||
|
@ -290,9 +290,9 @@ class AuditLogEntry(Hashable):
|
|||||||
# the overwrite_ actions have a dict with some information
|
# the overwrite_ actions have a dict with some information
|
||||||
instance_id = int(self.extra['id'])
|
instance_id = int(self.extra['id'])
|
||||||
the_type = self.extra.get('type')
|
the_type = self.extra.get('type')
|
||||||
if the_type == 'member':
|
if the_type == '1':
|
||||||
self.extra = self._get_member(instance_id)
|
self.extra = self._get_member(instance_id)
|
||||||
else:
|
elif the_type == '0':
|
||||||
role = self.guild.get_role(instance_id)
|
role = self.guild.get_role(instance_id)
|
||||||
if role is None:
|
if role is None:
|
||||||
role = Object(id=instance_id)
|
role = Object(id=instance_id)
|
||||||
|
@ -608,7 +608,7 @@ class DiscordWebSocket:
|
|||||||
payload = {
|
payload = {
|
||||||
'op': self.PRESENCE,
|
'op': self.PRESENCE,
|
||||||
'd': {
|
'd': {
|
||||||
'game': activity,
|
'activities': [activity],
|
||||||
'afk': afk,
|
'afk': afk,
|
||||||
'since': since,
|
'since': since,
|
||||||
'status': status
|
'status': status
|
||||||
|
@ -51,7 +51,7 @@ async def json_or_text(response):
|
|||||||
|
|
||||||
|
|
||||||
class Route:
|
class Route:
|
||||||
BASE = 'https://discord.com/api/v7'
|
BASE = 'https://discord.com/api/v8'
|
||||||
|
|
||||||
def __init__(self, method, path, **parameters):
|
def __init__(self, method, path, **parameters):
|
||||||
self.path = path
|
self.path = path
|
||||||
@ -151,7 +151,6 @@ class HTTPClient:
|
|||||||
# header creation
|
# header creation
|
||||||
headers = {
|
headers = {
|
||||||
'User-Agent': self.user_agent,
|
'User-Agent': self.user_agent,
|
||||||
'X-Ratelimit-Precision': 'millisecond',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.token is not None:
|
if self.token is not None:
|
||||||
@ -450,7 +449,7 @@ class HTTPClient:
|
|||||||
return self.request(r, reason=reason)
|
return self.request(r, reason=reason)
|
||||||
|
|
||||||
def delete_messages(self, channel_id, message_ids, *, reason=None):
|
def delete_messages(self, channel_id, message_ids, *, reason=None):
|
||||||
r = Route('POST', '/channels/{channel_id}/messages/bulk_delete', channel_id=channel_id)
|
r = Route('POST', '/channels/{channel_id}/messages/bulk-delete', channel_id=channel_id)
|
||||||
payload = {
|
payload = {
|
||||||
'messages': message_ids,
|
'messages': message_ids,
|
||||||
}
|
}
|
||||||
@ -1279,28 +1278,28 @@ class HTTPClient:
|
|||||||
def application_info(self):
|
def application_info(self):
|
||||||
return self.request(Route('GET', '/oauth2/applications/@me'))
|
return self.request(Route('GET', '/oauth2/applications/@me'))
|
||||||
|
|
||||||
async def get_gateway(self, *, encoding='json', v=6, zlib=True):
|
async def get_gateway(self, *, encoding='json', zlib=True):
|
||||||
try:
|
try:
|
||||||
data = await self.request(Route('GET', '/gateway'))
|
data = await self.request(Route('GET', '/gateway'))
|
||||||
except HTTPException as exc:
|
except HTTPException as exc:
|
||||||
raise GatewayNotFound() from exc
|
raise GatewayNotFound() from exc
|
||||||
if zlib:
|
if zlib:
|
||||||
value = '{0}?encoding={1}&v={2}&compress=zlib-stream'
|
value = '{0}?encoding={1}&v=8&compress=zlib-stream'
|
||||||
else:
|
else:
|
||||||
value = '{0}?encoding={1}&v={2}'
|
value = '{0}?encoding={1}&v=8'
|
||||||
return value.format(data['url'], encoding, v)
|
return value.format(data['url'], encoding)
|
||||||
|
|
||||||
async def get_bot_gateway(self, *, encoding='json', v=6, zlib=True):
|
async def get_bot_gateway(self, *, encoding='json', zlib=True):
|
||||||
try:
|
try:
|
||||||
data = await self.request(Route('GET', '/gateway/bot'))
|
data = await self.request(Route('GET', '/gateway/bot'))
|
||||||
except HTTPException as exc:
|
except HTTPException as exc:
|
||||||
raise GatewayNotFound() from exc
|
raise GatewayNotFound() from exc
|
||||||
|
|
||||||
if zlib:
|
if zlib:
|
||||||
value = '{0}?encoding={1}&v={2}&compress=zlib-stream'
|
value = '{0}?encoding={1}&v=8&compress=zlib-stream'
|
||||||
else:
|
else:
|
||||||
value = '{0}?encoding={1}&v={2}'
|
value = '{0}?encoding={1}&v=8'
|
||||||
return data['shards'], value.format(data['url'], encoding, v)
|
return data['shards'], value.format(data['url'], encoding)
|
||||||
|
|
||||||
def get_user(self, user_id):
|
def get_user(self, user_id):
|
||||||
return self.request(Route('GET', '/users/{user_id}', user_id=user_id))
|
return self.request(Route('GET', '/users/{user_id}', user_id=user_id))
|
||||||
|
@ -210,7 +210,7 @@ class Role(Hashable):
|
|||||||
|
|
||||||
def _update(self, data):
|
def _update(self, data):
|
||||||
self.name = data['name']
|
self.name = data['name']
|
||||||
self._permissions = int(data.get('permissions_new', 0))
|
self._permissions = int(data.get('permissions', 0))
|
||||||
self.position = data.get('position', 0)
|
self.position = data.get('position', 0)
|
||||||
self._colour = data.get('color', 0)
|
self._colour = data.get('color', 0)
|
||||||
self.hoist = data.get('hoist', False)
|
self.hoist = data.get('hoist', False)
|
||||||
|
@ -601,7 +601,6 @@ class ConnectionState:
|
|||||||
user = data['user']
|
user = data['user']
|
||||||
member_id = int(user['id'])
|
member_id = int(user['id'])
|
||||||
member = guild.get_member(member_id)
|
member = guild.get_member(member_id)
|
||||||
flags = self.member_cache_flags
|
|
||||||
if member is None:
|
if member is None:
|
||||||
if 'username' not in user:
|
if 'username' not in user:
|
||||||
# sometimes we receive 'incomplete' member data post-removal.
|
# sometimes we receive 'incomplete' member data post-removal.
|
||||||
@ -609,17 +608,12 @@ class ConnectionState:
|
|||||||
return
|
return
|
||||||
|
|
||||||
member, old_member = Member._from_presence_update(guild=guild, data=data, state=self)
|
member, old_member = Member._from_presence_update(guild=guild, data=data, state=self)
|
||||||
if flags.online or (flags._online_only and member.raw_status != 'offline'):
|
|
||||||
guild._add_member(member)
|
|
||||||
else:
|
else:
|
||||||
old_member = Member._copy(member)
|
old_member = Member._copy(member)
|
||||||
user_update = member._presence_update(data=data, user=user)
|
user_update = member._presence_update(data=data, user=user)
|
||||||
if user_update:
|
if user_update:
|
||||||
self.dispatch('user_update', user_update[0], user_update[1])
|
self.dispatch('user_update', user_update[0], user_update[1])
|
||||||
|
|
||||||
if member.id != self.self_id and flags._online_only and member.raw_status == 'offline':
|
|
||||||
guild._remove_member(member)
|
|
||||||
|
|
||||||
self.dispatch('member_update', old_member, member)
|
self.dispatch('member_update', old_member, member)
|
||||||
|
|
||||||
def parse_user_update(self, data):
|
def parse_user_update(self, data):
|
||||||
|
@ -152,7 +152,7 @@ class WebhookAdapter:
|
|||||||
The webhook that owns this adapter.
|
The webhook that owns this adapter.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
BASE = 'https://discord.com/api/v7'
|
BASE = 'https://discord.com/api/v8'
|
||||||
|
|
||||||
def _prepare(self, webhook):
|
def _prepare(self, webhook):
|
||||||
self._webhook_id = webhook.id
|
self._webhook_id = webhook.id
|
||||||
|
Loading…
x
Reference in New Issue
Block a user