Skip to content

Commit ea03545

Browse files
committed
Avoid some panics
1 parent 020c290 commit ea03545

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

bot/src/bot.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -515,16 +515,21 @@ impl From<TagName> for String {
515515
#[allow(clippy::unused_async)]
516516
async fn tag_autocomplete(ctx: Context<'_>, partial_tag: &str) -> Vec<TagName> {
517517
let database = &ctx.data().database;
518+
let Ok(database) = database.lock() else {
519+
return Vec::new();
520+
};
521+
522+
let Some(guild_id) = ctx.guild_id() else {
523+
return Vec::new();
524+
};
518525

519526
database
520-
.lock()
521-
.unwrap()
522527
.prepare("select name from tags where INSTR(name, :name) and guild = :guild limit 25")
523528
.and_then(|mut statement|
524529
// Convert `Vec<Result<String>>` into `Result<Vec<TagName>>` (abort if one of the rows failed).
525530
statement
526531
.query_and_then(
527-
named_params!(":name": partial_tag, ":guild": ctx.guild_id().unwrap().get()),
532+
named_params!(":name": partial_tag, ":guild": guild_id.get()),
528533
|row| row.get::<_, String>("name")
529534
)
530535
.and_then(|rows| rows.map(|row| row.map(TagName)).collect::<Result<Vec<_>, _>>()))
@@ -545,11 +550,12 @@ async fn tag(
545550
TagName(tag_name): TagName,
546551
) -> Result<(), PoiseError> {
547552
let database = &ctx.data().database;
553+
let guild_id = ctx.guild_id().ok_or("no guild id, so no tags")?.get();
548554
let text = database
549555
.lock()
550-
.unwrap()
556+
.map_err(|_| "db mutex poisoned, oops")?
551557
.prepare("select text from tags where name = :name and guild = :guild")?
552-
.query(named_params!(":name": tag_name, ":guild": ctx.guild_id().unwrap().get()))?
558+
.query(named_params!(":name": tag_name, ":guild": guild_id))?
553559
.next()?
554560
.map(|row| row.get::<_, String>("text"))
555561
.transpose()?;
@@ -583,9 +589,12 @@ async fn set_tag(
583589
) -> Result<(), PoiseError> {
584590
let database = &ctx.data().database;
585591

586-
database.lock().unwrap().execute(
592+
let guild_id = ctx.guild_id().ok_or("no guild id, so no tags")?.get();
593+
database.lock()
594+
.map_err(|_| "db mutex poisoned, oops")?
595+
.execute(
587596
"insert into tags (name, guild, text) values (:name, :guild, :text) on conflict do update set text = :text",
588-
named_params!(":name": tag_name, ":guild": ctx.guild_id().unwrap().get(), ":text": tag_text),
597+
named_params!(":name": tag_name, ":guild": guild_id, ":text": tag_text),
589598
)?;
590599

591600
let author = ctx.author().id;
@@ -618,10 +627,14 @@ async fn delete_tag(
618627
) -> Result<(), PoiseError> {
619628
let database = &ctx.data().database;
620629

621-
let num_rows = database.lock().unwrap().execute(
622-
"delete from tags where name = :name and guild = :guild",
623-
named_params!(":name": tag_name, ":guild": ctx.guild_id().unwrap().get()),
624-
)?;
630+
let guild_id = ctx.guild_id().ok_or("no guild id, so no tags")?.get();
631+
let num_rows = database
632+
.lock()
633+
.map_err(|_| "db mutex poisoned, oops")?
634+
.execute(
635+
"delete from tags where name = :name and guild = :guild",
636+
named_params!(":name": tag_name, ":guild": guild_id),
637+
)?;
625638

626639
let message = if num_rows > 0 {
627640
format!("Tag {tag_name:?} deleted by <@{}>", ctx.author().id)
@@ -653,12 +666,13 @@ async fn list_tags(
653666
) -> Result<(), PoiseError> {
654667
let reply = {
655668
let database = &ctx.data().database;
656-
let database = database.lock().unwrap();
669+
let database = database.lock().map_err(|_| "db mutex poisoned, oops")?;
657670
let mut statement = database.prepare(
658671
"select name from tags where guild = :guild and (:filter is null or instr(name, :filter) > 0) order by name",
659672
)?;
673+
let guild_id = ctx.guild_id().ok_or("no guild id, so no tags")?.get();
660674
let mut results = statement.query_map(
661-
named_params!(":filter": filter, ":guild": ctx.guild_id().unwrap().get()),
675+
named_params!(":filter": filter, ":guild": guild_id),
662676
|row| row.get::<_, Box<str>>("name"),
663677
)?;
664678
results.try_fold(String::new(), |mut acc, name| {

0 commit comments

Comments
 (0)