Merge pull request #18 from polyphony-chat/feature/gateway-observer

Feature/gateway observer
This commit is contained in:
Flori 2023-04-25 23:10:47 +02:00 committed by GitHub
commit c5039b62c7
4 changed files with 588 additions and 20 deletions

View File

@ -12,4 +12,6 @@ reqwest = "0.11.16"
url = "2.3.1" url = "2.3.1"
chrono = "0.4.24" chrono = "0.4.24"
regex = "1.7.3" regex = "1.7.3"
custom_error = "1.9.2" custom_error = "1.9.2"
native-tls = "0.2.11"
tokio-tungstenite = {version = "0.18.0", features = ["native-tls"]}

View File

@ -56,6 +56,6 @@ mod instance_policies_schema_test {
.unwrap(); .unwrap();
let schema = test_instance.instance_policies_schema().await.unwrap(); let schema = test_instance.instance_policies_schema().await.unwrap();
println!("{}", schema); println!("{:?}", schema);
} }
} }

View File

@ -1,3 +1,9 @@
/*
To learn more about the types implemented here, please visit
https://discord.com/developers/docs .
I do not feel like re-documenting all of this, as everything is already perfectly explained there.
*/
use std::fmt; use std::fmt;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -101,23 +107,6 @@ impl InstancePolicies {
} }
} }
impl fmt::Display for InstancePolicies {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"InstancePoliciesSchema {{ instance_name: {}, instance_description: {}, front_page: {}, tos_page: {}, correspondence_email: {}, correspondence_user_id: {}, image: {}, instance_id: {} }}",
self.instance_name,
self.instance_description.clone().unwrap_or("None".to_string()),
self.front_page.clone().unwrap_or("None".to_string()),
self.tos_page.clone().unwrap_or("None".to_string()),
self.correspondence_email.clone().unwrap_or("None".to_string()),
self.correspondence_user_id.clone().unwrap_or("None".to_string()),
self.image.clone().unwrap_or("None".to_string()),
self.instance_id.clone().unwrap_or("None".to_string()),
)
}
}
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct ErrorResponse { pub struct ErrorResponse {
pub code: i32, pub code: i32,
@ -211,3 +200,578 @@ impl User {
} }
} }
} }
#[derive(Debug, Serialize, Deserialize)]
struct Message {
id: String,
channel_id: String,
author: UserObject,
content: String,
timestamp: String,
edited_timestamp: Option<String>,
tts: bool,
mention_everyone: bool,
mentions: Vec<UserObject>,
mention_roles: Vec<String>,
mention_channels: Option<Vec<ChannelMention>>,
attachments: Vec<Attachment>,
embeds: Vec<Embed>,
reactions: Option<Vec<Reaction>>,
nonce: Option<serde_json::Value>,
pinned: bool,
webhook_id: Option<String>,
#[serde(rename = "type")]
message_type: i32,
activity: Option<MessageActivity>,
application: Option<Application>,
application_id: Option<String>,
message_reference: Option<MessageReference>,
flags: Option<i32>,
referenced_message: Option<Box<Message>>,
interaction: Option<MessageInteraction>,
thread: Option<Channel>,
components: Option<Vec<Component>>,
sticker_items: Option<Vec<StickerItem>>,
stickers: Option<Vec<Sticker>>,
position: Option<i32>,
role_subscription_data: Option<RoleSubscriptionData>,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageCreate {
#[serde(flatten)]
message: Message,
guild_id: Option<String>,
member: Option<GuildMember>,
mentions: Vec<(UserObject, GuildMember)>, // Not sure if this is correct: https://discord.com/developers/docs/topics/gateway-events#message-create
}
#[derive(Debug, Serialize, Deserialize)]
struct PartialMessage {
id: Option<String>,
channel_id: Option<String>,
author: Option<UserObject>,
content: Option<String>,
timestamp: Option<String>,
edited_timestamp: Option<String>,
tts: Option<bool>,
mention_everyone: Option<bool>,
mentions: Option<Vec<UserObject>>,
mention_roles: Option<Vec<String>>,
mention_channels: Option<Vec<ChannelMention>>,
attachments: Option<Vec<Attachment>>,
embeds: Option<Vec<Embed>>,
reactions: Option<Vec<Reaction>>,
nonce: Option<serde_json::Value>,
pinned: Option<bool>,
webhook_id: Option<String>,
#[serde(rename = "type")]
message_type: Option<i32>,
activity: Option<MessageActivity>,
application: Option<Application>,
application_id: Option<String>,
message_reference: Option<MessageReference>,
flags: Option<i32>,
referenced_message: Option<Box<Message>>,
interaction: Option<MessageInteraction>,
thread: Option<Channel>,
components: Option<Vec<Component>>,
sticker_items: Option<Vec<StickerItem>>,
stickers: Option<Vec<Sticker>>,
position: Option<i32>,
role_subscription_data: Option<RoleSubscriptionData>,
guild_id: Option<String>,
member: Option<GuildMember>,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageUpdate {
#[serde(flatten)]
message: PartialMessage,
guild_id: Option<String>,
member: Option<GuildMember>,
mentions: Vec<(UserObject, GuildMember)>, // Not sure if this is correct: https://discord.com/developers/docs/topics/gateway-events#message-create
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageDelete {
id: String,
channel_id: String,
guild_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageDeleteBulk {
ids: Vec<String>,
channel_id: String,
guild_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageReactionAdd {
user_id: String,
channel_id: String,
message_id: String,
guild_id: Option<String>,
member: Option<GuildMember>,
emoji: Emoji,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageReactionRemove {
user_id: String,
channel_id: String,
message_id: String,
guild_id: Option<String>,
emoji: Emoji,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageReactionRemoveAll {
channel_id: String,
message_id: String,
guild_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageReactionRemoveEmoji {
channel_id: String,
message_id: String,
guild_id: Option<String>,
emoji: Emoji,
}
#[derive(Debug, Serialize, Deserialize)]
struct ChannelMention {
id: String,
guild_id: String,
#[serde(rename = "type")]
channel_type: i32,
name: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct Attachment {
id: String,
filename: String,
description: Option<String>,
content_type: Option<String>,
size: i64,
url: String,
proxy_url: String,
height: Option<String>,
width: Option<String>,
ephemeral: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
/**
Represents an Embed. [See the Discord Documentation](https://discord.com/developers/docs/resources/channel#embed-object).
*/
struct Embed {
title: Option<String>,
#[serde(rename = "type")]
embed_type: Option<String>,
description: Option<String>,
url: Option<String>,
timestamp: Option<String>,
color: Option<i32>,
footer: Option<EmbedFooter>,
image: Option<EmbedImage>,
thumbnail: Option<EmbedThumbnail>,
video: Option<EmbedVideo>,
provider: Option<EmbedProvider>,
author: Option<EmbedAuthor>,
fields: Option<Vec<EmbedField>>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedFooter {
text: String,
icon_url: Option<String>,
proxy_icon_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedImage {
url: String,
proxy_url: String,
height: Option<i32>,
width: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedThumbnail {
url: String,
proxy_url: Option<String>,
height: Option<i32>,
width: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedVideo {
url: Option<String>,
proxy_url: Option<String>,
height: Option<i32>,
width: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedProvider {
name: Option<String>,
url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedAuthor {
name: String,
url: Option<String>,
icon_url: Option<String>,
proxy_icon_url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct EmbedField {
name: String,
value: String,
inline: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
struct Reaction {
count: i32,
me: bool,
emoji: Emoji,
}
#[derive(Debug, Deserialize, Serialize)]
struct Emoji {
id: Option<u64>,
name: Option<String>,
roles: Option<Vec<u64>>,
user: Option<UserObject>,
require_colons: Option<bool>,
managed: Option<bool>,
animated: Option<bool>,
available: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageActivity {
#[serde(rename = "type")]
activity_type: i64,
party_id: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
struct Application {
id: String,
name: String,
icon: Option<String>,
description: String,
rpc_origins: Option<Vec<String>>,
bot_public: bool,
bot_require_code_grant: bool,
terms_of_service_url: Option<String>,
privacy_policy_url: Option<String>,
owner: Option<UserObject>,
summary: String,
verify_key: String,
team: Option<Team>,
guild_id: Option<String>,
primary_sku_id: Option<String>,
slug: Option<String>,
cover_image: Option<String>,
flags: Option<i32>,
tags: Option<Vec<String>>,
install_params: Option<InstallParams>,
custom_install_url: Option<String>,
role_connections_verification_url: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
struct Team {
icon: Option<String>,
id: u64,
members: Vec<TeamMember>,
name: String,
owner_user_id: u64,
}
#[derive(Debug, Deserialize, Serialize)]
struct TeamMember {
membership_state: u8,
permissions: Vec<String>,
team_id: u64,
user: UserObject,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
enum MembershipState {
Invited = 1,
Accepted = 2,
}
#[derive(Debug, Serialize, Deserialize)]
struct InstallParams {
scopes: Vec<String>,
permissions: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct MessageReference {
message_id: Option<String>,
channel_id: Option<String>,
guild_id: Option<String>,
fail_if_not_exists: Option<bool>,
}
#[derive(Debug, Deserialize, Serialize)]
struct MessageInteraction {
id: u64,
#[serde(rename = "type")]
interaction_type: u8,
name: String,
user: UserObject,
member: Option<GuildMember>,
}
#[derive(Debug, Deserialize, Serialize)]
struct GuildMember {
user: Option<UserObject>,
nick: Option<String>,
avatar: Option<String>,
roles: Vec<String>,
joined_at: String,
premium_since: Option<String>,
deaf: bool,
mute: bool,
flags: i32,
pending: Option<bool>,
permissions: Option<String>,
communication_disabled_until: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct Channel {
id: String,
#[serde(rename = "type")]
channel_type: i32,
guild_id: Option<String>,
position: Option<i32>,
permission_overwrites: Option<Vec<PermissionOverwrite>>,
name: Option<String>,
topic: Option<String>,
nsfw: Option<bool>,
last_message_id: Option<String>,
bitrate: Option<i32>,
user_limit: Option<i32>,
rate_limit_per_user: Option<i32>,
recipients: Option<Vec<UserObject>>,
icon: Option<String>,
owner_id: Option<String>,
application_id: Option<String>,
parent_id: Option<String>,
last_pin_timestamp: Option<String>,
rtc_region: Option<String>,
video_quality_mode: Option<i32>,
message_count: Option<i32>,
member_count: Option<i32>,
thread_metadata: Option<ThreadMetadata>,
member: Option<ThreadMember>,
default_auto_archive_duration: Option<i32>,
permissions: Option<String>,
flags: Option<i32>,
total_message_sent: Option<i32>,
available_tags: Option<Vec<Tag>>,
applied_tags: Option<Vec<String>>,
default_reaction_emoji: Option<DefaultReaction>,
default_thread_rate_limit_per_user: Option<i32>,
default_sort_order: Option<i32>,
default_forum_layout: Option<i32>,
}
#[derive(Debug, Deserialize, Serialize)]
struct Tag {
id: u64,
name: String,
moderated: bool,
emoji_id: Option<u64>,
emoji_name: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PermissionOverwrite {
id: String,
#[serde(rename = "type")]
overwrite_type: u8,
allow: String,
deny: String,
}
#[derive(Debug, Deserialize, Serialize)]
struct ThreadMetadata {
archived: bool,
auto_archive_duration: i32,
archive_timestamp: String,
locked: bool,
invitable: Option<bool>,
create_timestamp: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
struct ThreadMember {
id: Option<u64>,
user_id: Option<u64>,
join_timestamp: Option<String>,
flags: Option<u64>,
member: Option<GuildMember>,
}
#[derive(Debug, Deserialize, Serialize)]
struct DefaultReaction {
emoji_id: Option<String>,
emoji_name: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
enum Component {
ActionRow = 1,
Button = 2,
StringSelect = 3,
TextInput = 4,
UserSelect = 5,
RoleSelect = 6,
MentionableSelect = 7,
ChannelSelect = 8,
}
#[derive(Debug, Serialize, Deserialize)]
struct StickerItem {
id: u64,
name: String,
format_type: u8,
}
#[derive(Debug, Serialize, Deserialize)]
struct Sticker {
id: u64,
pack_id: Option<u64>,
name: String,
description: Option<String>,
tags: String,
asset: Option<String>,
#[serde(rename = "type")]
sticker_type: u8,
format_type: u8,
available: Option<bool>,
guild_id: Option<u64>,
user: Option<UserObject>,
sort_value: Option<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
struct RoleSubscriptionData {
role_subscription_listing_id: u64,
tier_name: String,
total_months_subscribed: u32,
is_renewal: bool,
}
#[derive(Debug, Deserialize, Serialize)]
struct TypingStartEvent {
channel_id: String,
guild_id: Option<String>,
user_id: String,
timestamp: i64,
member: Option<GuildMember>,
}
#[derive(Debug, Deserialize, Serialize)]
struct GatewayIdentifyPayload {
token: String,
properties: GatewayIdentifyConnectionProps,
compress: Option<bool>,
large_threshold: Option<i16>, //default: 50
shard: Option<Vec<(i32, i32)>>,
presence: Option<PresenceUpdate>,
intents: i32,
}
#[derive(Debug, Deserialize, Serialize)]
struct GatewayIdentifyConnectionProps {
os: String,
browser: String,
device: String,
}
#[derive(Debug, Deserialize, Serialize)]
struct PresenceUpdate {
since: Option<i64>,
activities: Vec<Activity>,
status: String,
afk: bool,
}
#[derive(Debug, Deserialize, Serialize)]
struct Activity {
name: String,
#[serde(rename = "type")]
activity_type: i32,
url: Option<String>,
created_at: i64,
timestamps: Option<ActivityTimestamps>,
application_id: Option<String>,
details: Option<String>,
state: Option<String>,
emoji: Option<Emoji>,
party: Option<ActivityParty>,
assets: Option<ActivityAssets>,
secrets: Option<ActivitySecrets>,
instance: Option<bool>,
flags: Option<i32>,
buttons: Option<Vec<ActivityButton>>,
}
#[derive(Debug, Deserialize, Serialize)]
struct ActivityTimestamps {
start: Option<i64>,
end: Option<i64>,
}
#[derive(Debug, Deserialize, Serialize)]
struct ActivityParty {
id: Option<String>,
size: Option<Vec<(i32, i32)>>,
}
#[derive(Debug, Deserialize, Serialize)]
struct ActivityAssets {
large_image: Option<String>,
large_text: Option<String>,
small_image: Option<String>,
small_text: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
struct ActivitySecrets {
join: Option<String>,
spectate: Option<String>,
#[serde(rename = "match")]
match_string: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
struct ActivityButton {
label: String,
url: String,
}
#[derive(Debug, Deserialize, Serialize)]
struct GatewayResume {
token: String,
session_id: String,
seq: String,
}

View File

@ -1,2 +1,4 @@
#[derive(Debug)] #[derive(Debug)]
pub struct Gateway {} pub struct Gateway {
url: String,
}