Skip to content

Commit f7c5fd6

Browse files
Merge pull request #17 from OpenTabletDriver/cleanup
Clean up redundant traits and minor bugs
2 parents c3ec420 + 24961df commit f7c5fd6

6 files changed

Lines changed: 52 additions & 52 deletions

File tree

src/commands/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ pub async fn register(ctx: &Context) -> ApplicationCommandMap {
3535
pub async fn interact(ctx: &Context, interaction: &ApplicationCommandInteraction) {
3636
let name = &interaction.data.name;
3737

38+
interaction.defer(ctx).await.expect("Failed to defer interaction");
39+
3840
match name.as_str() {
3941
"snippet" => snippets::snippet(ctx, interaction).await,
4042
"create-snippet" => snippets::create_snippet(ctx, interaction).await,
@@ -45,8 +47,6 @@ pub async fn interact(ctx: &Context, interaction: &ApplicationCommandInteraction
4547
_ => {
4648
println!("WARNING: Received invalid application command interaction!: {}", name);
4749

48-
interaction.defer(ctx).await.expect("Failed to defer interaction");
49-
5050
let title = "Invalid application command";
5151
let content = &format!("An invalid application command was recieved: {}", name);
5252
respond_err(ctx, interaction, title, content).await;
@@ -144,7 +144,6 @@ impl ApplicationCommandMap {
144144
)
145145
.clone();
146146

147-
148147
let mut commands = ApplicationCommandMap(CommandHashMap::new());
149148

150149
commands.insert("snippet", snippet);

src/commands/snippets.rs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use serenity::json::Value;
44
use serenity::model::prelude::command::CommandOptionType;
55
use serenity::model::prelude::interaction::application_command::{ApplicationCommandInteraction, CommandDataOptionValue};
66
use serenity::prelude::Context;
7-
use crate::structures::{State, Snippet};
7+
use crate::structures::{State, Snippet, Embeddable};
88
use crate::commands::{arg, respond_ok};
99

1010
use super::{respond_err, respond_embed, arg_opt};
@@ -27,10 +27,8 @@ pub(super) fn sync_snippets(state: &State, command: &mut CreateApplicationComman
2727
pub(super) async fn snippet(ctx: &Context, interaction: &ApplicationCommandInteraction) {
2828
match arg(interaction, "id") {
2929
CommandDataOptionValue::String(id) => {
30-
interaction.defer(ctx).await.expect("Failed to defer interaction");
31-
3230
if let Some(snippet) = get_snippet(ctx, &id).await {
33-
let embed = snippet.create_embed();
31+
let embed = snippet.embed();
3432

3533
respond_embed(ctx, interaction, &embed, false).await;
3634
} else {
@@ -47,8 +45,6 @@ pub(super) async fn edit_snippet(ctx: &Context, interaction: &ApplicationCommand
4745
let content = arg_opt(interaction, "content");
4846

4947
if let CommandDataOptionValue::String(id) = id {
50-
interaction.defer(ctx).await.expect("Failed to defer interaction");
51-
5248
{
5349
let mut data = ctx.data.write().await;
5450
let state = data.get_mut::<State>().expect("Failed to get state");
@@ -97,7 +93,7 @@ pub(super) async fn edit_snippet(ctx: &Context, interaction: &ApplicationCommand
9793

9894
let mut embed = get_snippet(ctx, &id).await
9995
.expect("Failed to get snippet for recently modified snippet")
100-
.create_embed();
96+
.embed();
10197

10298
embed.colour(super::OK_COLOUR);
10399

@@ -116,8 +112,6 @@ pub(super) async fn create_snippet(ctx: &Context, interaction: &ApplicationComma
116112
CommandDataOptionValue::String(title),
117113
CommandDataOptionValue::String(content)
118114
) => {
119-
interaction.defer(ctx).await.expect("Failed to defer interaction");
120-
121115
let embed = {
122116
let mut data = ctx.data.write().await;
123117
let state = data.get_mut::<State>().expect("Failed to get state");
@@ -134,7 +128,7 @@ pub(super) async fn create_snippet(ctx: &Context, interaction: &ApplicationComma
134128

135129
println!("New snippet created '{}: {}'", id, title);
136130

137-
let mut embed = snippet.create_embed();
131+
let mut embed = snippet.embed();
138132
embed.colour(super::OK_COLOUR);
139133

140134
state.snippets.push(snippet);
@@ -159,8 +153,6 @@ pub(super) async fn remove_snippet(ctx: &Context, interaction: &ApplicationComma
159153

160154
match id {
161155
CommandDataOptionValue::String(id) => {
162-
interaction.defer(ctx).await.expect("Failed to defer interaction");
163-
164156
println!("Removing snippet '{id}'");
165157

166158
match get_snippet(ctx, &id).await {
@@ -188,16 +180,12 @@ pub(super) async fn export_snippet(ctx: &Context, interaction: &ApplicationComma
188180

189181
match id {
190182
CommandDataOptionValue::String(id) => {
191-
interaction.defer(ctx).await.expect("Failed to defer interaction");
192-
193183
let snippet = get_snippet(ctx, &id).await
194184
.expect("Failed to get snippet");
195185

196-
let embed = snippet.create_embed();
197-
198186
let result = interaction.create_followup_message(ctx, |r| r
199187
.content(format!("```{}```", &snippet.content.replace("\n", r#"\n"#)))
200-
.add_embed(embed)
188+
.add_embed(snippet.embed())
201189
).await;
202190

203191
if let Err(e) = result {
@@ -208,12 +196,8 @@ pub(super) async fn export_snippet(ctx: &Context, interaction: &ApplicationComma
208196
}
209197
}
210198

211-
trait SnippetEmbed {
212-
fn create_embed(&self) -> CreateEmbed;
213-
}
214-
215-
impl SnippetEmbed for Snippet {
216-
fn create_embed(&self) -> CreateEmbed {
199+
impl Embeddable for Snippet {
200+
fn embed(&self) -> CreateEmbed {
217201
CreateEmbed::default()
218202
.title(&self.title)
219203
.description(&self.content)

src/commands/utils.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ pub(super) async fn embed(ctx: &Context, interaction: &ApplicationCommandInterac
1313
let footer_text = arg_opt(interaction, "footer");
1414
let image = arg_opt(interaction, "image");
1515

16-
interaction.defer(ctx).await.expect("Failed to defer interaction");
17-
1816
let mut embed = CreateEmbed::default();
1917

2018
if let Some(CommandDataOptionValue::String(title)) = title {

src/events/code.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ async fn get_embeds(ctx: &Context, message: &Message) -> Option<Vec<CreateEmbed>
2323

2424
if let Some(refs) = FileReference::try_from_str(&message.content) {
2525
for file_ref in refs {
26-
embeds.push(file_ref.create_embed().await);
26+
if let Some(embed) = file_ref.create_embed().await {
27+
embeds.push(embed);
28+
}
2729
}
2830
}
2931

@@ -98,20 +100,23 @@ impl FileReference<'_> {
98100
}
99101
}
100102

101-
pub async fn create_embed(&self) -> CreateEmbed {
103+
pub async fn create_embed(&self) -> Option<CreateEmbed> {
102104
let extension = self.get_extension();
103105

104-
let mut content = self.display().await.expect("Failed to get content");
105-
content.shrink_to(4096 - 8 - extension.len());
106+
if let Some(mut content) = self.display().await {
107+
content.shrink_to(4096 - 8 - extension.len());
106108

107-
let description = format!("```{}\n{}\n```", extension, content);
109+
let description = format!("```{}\n{}\n```", extension, content);
108110

109-
let mut default = CreateEmbed::default();
110-
default.title(self.path)
111-
.description(description)
112-
.colour(ACCENT_COLOUR);
111+
let mut default = CreateEmbed::default();
112+
default.title(self.path)
113+
.description(description)
114+
.colour(ACCENT_COLOUR);
113115

114-
default
116+
Some(default)
117+
} else {
118+
None
119+
}
115120
}
116121

117122
fn get_extension(&self) -> String {
@@ -131,9 +136,13 @@ impl FileReference<'_> {
131136
let start = self.start - 1;
132137

133138
if let Some(end) = self.end {
134-
return Some(trim_indent(&lines[start..=end]))
139+
if end <= start {
140+
None
141+
} else {
142+
Some(trim_indent(&lines[start..end]))
143+
}
135144
} else {
136-
return Some(lines[start].trim_start().to_string())
145+
Some(lines[start].trim_start().to_string())
137146
}
138147
} else {
139148
None

src/events/issue.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use serenity::builder::CreateEmbed;
55
use serenity::model::prelude::Message;
66
use serenity::prelude::Context;
77
use serenity::utils::Colour;
8+
use crate::structures::Embeddable;
89

910
const REPO_OWNER: &str = "OpenTabletDriver";
1011
const REPO_NAME: &str = "OpenTabletDriver";
@@ -62,10 +63,9 @@ async fn issue_embeds(message: &Message) -> Option<Vec<CreateEmbed>> {
6263
}
6364
}
6465

65-
trait Embeddable {
66-
fn embed(&self) -> CreateEmbed;
66+
trait Document {
6767
fn get_title(&self) -> String;
68-
fn get_description(&self) -> String;
68+
fn get_content(&self) -> String;
6969
fn get_colour(&self) -> Colour;
7070
fn get_labels(&self) -> Option<String>;
7171
}
@@ -74,8 +74,8 @@ impl Embeddable for Issue {
7474
fn embed(&self) -> CreateEmbed {
7575
let mut default = CreateEmbed::default();
7676
let embed = default
77-
.title(format!("#{}: {}", self.number, self.title))
78-
.description(self.get_description())
77+
.title(self.get_title())
78+
.description(self.get_content())
7979
.url(self.html_url.as_str())
8080
.colour(self.get_colour())
8181
.author(|a| a
@@ -94,12 +94,14 @@ impl Embeddable for Issue {
9494

9595
embed.to_owned()
9696
}
97+
}
9798

99+
impl Document for Issue {
98100
fn get_title(&self) -> String {
99101
format!("#{}: {}", self.number, self.title)
100102
}
101103

102-
fn get_description(&self) -> String {
104+
fn get_content(&self) -> String {
103105
let body = self.body.as_deref().unwrap_or_default();
104106

105107
let mut description = String::default();
@@ -139,7 +141,7 @@ impl Embeddable for PullRequest {
139141
let mut default = CreateEmbed::default();
140142
let embed = default
141143
.title(self.get_title())
142-
.description(self.get_description())
144+
.description(self.get_content())
143145
.colour(self.get_colour());
144146

145147
if let Some(user) = &self.user {
@@ -164,24 +166,27 @@ impl Embeddable for PullRequest {
164166

165167
embed.to_owned()
166168
}
169+
}
170+
167171

172+
impl Document for PullRequest {
168173
fn get_title(&self) -> String {
169174
match &self.title {
170175
Some(title) => format!("#{}: {}", self.number, title),
171176
None => format!("#{}", self.number)
172177
}
173178
}
174179

175-
fn get_description(&self) -> String {
180+
fn get_content(&self) -> String {
176181
let body = self.body.as_deref().unwrap_or_default();
177182

178-
let mut description = String::default();
183+
let mut content = String::default();
179184
for line in body.split("\n").take(15) {
180-
description.push_str(&format!("{}\n", line));
185+
content.push_str(&format!("{}\n", line));
181186
}
182187

183-
description.shrink_to(4096);
184-
description
188+
content.shrink_to(4096);
189+
content
185190
}
186191

187192
fn get_colour(&self) -> Colour {

src/structures.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use serde_json::{from_reader, to_writer_pretty};
22
use serde::{Deserialize, Serialize};
3+
use serenity::builder::CreateEmbed;
34
use serenity::client::bridge::gateway::ShardManager;
45
use serenity::prelude::{TypeMapKey, Mutex};
56
use std::env;
@@ -13,6 +14,10 @@ impl TypeMapKey for ShardManagerContainer {
1314
type Value = Arc<Mutex<ShardManager>>;
1415
}
1516

17+
pub trait Embeddable {
18+
fn embed(&self) -> CreateEmbed;
19+
}
20+
1621
#[derive(Deserialize, Serialize, Clone)]
1722
pub struct Snippet {
1823
pub id: String,

0 commit comments

Comments
 (0)