mirror of
https://github.com/Noratrieb/discord-court-bot.git
synced 2026-01-17 03:15:01 +01:00
lawsuit ctx
This commit is contained in:
parent
984125841c
commit
2a1d598cca
2 changed files with 121 additions and 109 deletions
|
|
@ -15,6 +15,7 @@ use crate::{
|
||||||
model::SnowflakeId,
|
model::SnowflakeId,
|
||||||
Mongo, WrapErr,
|
Mongo, WrapErr,
|
||||||
};
|
};
|
||||||
|
use crate::lawsuit::LawsuitCtx;
|
||||||
|
|
||||||
fn slash_commands(commands: &mut CreateApplicationCommands) -> &mut CreateApplicationCommands {
|
fn slash_commands(commands: &mut CreateApplicationCommands) -> &mut CreateApplicationCommands {
|
||||||
commands.create_application_command(|command| {
|
commands.create_application_command(|command| {
|
||||||
|
|
@ -208,8 +209,15 @@ async fn lawsuit_command_handler(
|
||||||
court_room: SnowflakeId(0),
|
court_room: SnowflakeId(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
let response = lawsuit
|
let lawsuit_ctx = LawsuitCtx {
|
||||||
.initialize(ctx.http.clone(), guild_id, mongo_client.clone())
|
lawsuit,
|
||||||
|
mongo_client: mongo_client.clone(),
|
||||||
|
http: ctx.http.clone(),
|
||||||
|
guild_id
|
||||||
|
};
|
||||||
|
|
||||||
|
let response = lawsuit_ctx
|
||||||
|
.initialize()
|
||||||
.await
|
.await
|
||||||
.wrap_err("initialize lawsuit")?;
|
.wrap_err("initialize lawsuit")?;
|
||||||
|
|
||||||
|
|
|
||||||
106
src/lawsuit.rs
106
src/lawsuit.rs
|
|
@ -34,14 +34,19 @@ pub struct Lawsuit {
|
||||||
pub court_room: SnowflakeId,
|
pub court_room: SnowflakeId,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Lawsuit {
|
pub struct LawsuitCtx {
|
||||||
pub async fn initialize(
|
pub lawsuit: Lawsuit,
|
||||||
mut self,
|
pub mongo_client: Mongo,
|
||||||
http: Arc<Http>,
|
pub http: Arc<Http>,
|
||||||
guild_id: GuildId,
|
pub guild_id: GuildId,
|
||||||
mongo_client: Mongo,
|
}
|
||||||
) -> Result<Response> {
|
|
||||||
let state = mongo_client.find_or_insert_state(guild_id.into()).await?;
|
impl LawsuitCtx {
|
||||||
|
pub async fn initialize(mut self) -> Result<Response> {
|
||||||
|
let state = self
|
||||||
|
.mongo_client
|
||||||
|
.find_or_insert_state(self.guild_id.into())
|
||||||
|
.await?;
|
||||||
|
|
||||||
let free_room = state
|
let free_room = state
|
||||||
.court_rooms
|
.court_rooms
|
||||||
|
|
@ -54,13 +59,8 @@ impl Lawsuit {
|
||||||
(None, Some(category)) => {
|
(None, Some(category)) => {
|
||||||
// create room
|
// create room
|
||||||
|
|
||||||
let result = create_room(
|
let result = self
|
||||||
&http,
|
.create_room(state.court_rooms.len(), *category)
|
||||||
guild_id,
|
|
||||||
state.court_rooms.len(),
|
|
||||||
*category,
|
|
||||||
&mongo_client,
|
|
||||||
)
|
|
||||||
.await
|
.await
|
||||||
.wrap_err("create new room")?;
|
.wrap_err("create new room")?;
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ impl Lawsuit {
|
||||||
};
|
};
|
||||||
|
|
||||||
let result = self
|
let result = self
|
||||||
.send_process_open_message(&http, guild_id, &room)
|
.send_process_open_message(&self.http, self.guild_id, &room)
|
||||||
.await
|
.await
|
||||||
.wrap_err("send process open message")?;
|
.wrap_err("send process open message")?;
|
||||||
|
|
||||||
|
|
@ -85,10 +85,10 @@ impl Lawsuit {
|
||||||
}
|
}
|
||||||
|
|
||||||
let channel_id = room.channel_id;
|
let channel_id = room.channel_id;
|
||||||
self.court_room = channel_id;
|
self.lawsuit.court_room = channel_id;
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
if let Err(err) = self.setup(guild_id, http, mongo_client, room).await {
|
if let Err(err) = self.setup(room).await {
|
||||||
error!(?err, "Error setting up lawsuit");
|
error!(?err, "Error setting up lawsuit");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -99,14 +99,16 @@ impl Lawsuit {
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn setup(
|
async fn setup(&self, room: CourtRoom) -> Result<()> {
|
||||||
&self,
|
let Self {
|
||||||
guild_id: GuildId,
|
mongo_client,
|
||||||
http: Arc<Http>,
|
http,
|
||||||
mongo_client: Mongo,
|
guild_id,
|
||||||
room: CourtRoom,
|
lawsuit,
|
||||||
) -> Result<()> {
|
} = self;
|
||||||
mongo_client.add_lawsuit(guild_id.into(), self).await?;
|
let guild_id = *guild_id;
|
||||||
|
|
||||||
|
mongo_client.add_lawsuit(guild_id.into(), lawsuit).await?;
|
||||||
mongo_client
|
mongo_client
|
||||||
.set_court_room(
|
.set_court_room(
|
||||||
guild_id.into(),
|
guild_id.into(),
|
||||||
|
|
@ -129,18 +131,17 @@ impl Lawsuit {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
assign_role(lawsuit.accused, &http, guild_id, room.role_id).await?;
|
||||||
assign_role(self.accused, &http, guild_id, room.role_id).await?;
|
if let Some(accused_lawyer) = lawsuit.accused_lawyer {
|
||||||
if let Some(accused_lawyer) = self.accused_lawyer {
|
|
||||||
assign_role(accused_lawyer, &http, guild_id, room.role_id).await?;
|
assign_role(accused_lawyer, &http, guild_id, room.role_id).await?;
|
||||||
}
|
}
|
||||||
assign_role(self.plaintiff, &http, guild_id, room.role_id).await?;
|
assign_role(lawsuit.plaintiff, &http, guild_id, room.role_id).await?;
|
||||||
if let Some(plaintiff_lawyer) = self.plaintiff_lawyer {
|
if let Some(plaintiff_lawyer) = lawsuit.plaintiff_lawyer {
|
||||||
assign_role(plaintiff_lawyer, &http, guild_id, room.role_id).await?;
|
assign_role(plaintiff_lawyer, &http, guild_id, room.role_id).await?;
|
||||||
}
|
}
|
||||||
assign_role(self.judge, &http, guild_id, room.role_id).await?;
|
assign_role(lawsuit.judge, &http, guild_id, room.role_id).await?;
|
||||||
|
|
||||||
info!(?self, "Created lawsuit");
|
info!(?lawsuit, "Created lawsuit");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
@ -166,28 +167,29 @@ impl Lawsuit {
|
||||||
.id
|
.id
|
||||||
.send_message(http, |msg| {
|
.send_message(http, |msg| {
|
||||||
msg.embed(|embed| {
|
msg.embed(|embed| {
|
||||||
|
let lawsuit = &self.lawsuit;
|
||||||
embed
|
embed
|
||||||
.title("Prozess")
|
.title("Prozess")
|
||||||
.field("Grund", &self.reason, false)
|
.field("Grund", &lawsuit.reason, false)
|
||||||
.field("Kläger", format!("<@{}>", self.plaintiff), false)
|
.field("Kläger", format!("<@{}>", lawsuit.plaintiff), false)
|
||||||
.field(
|
.field(
|
||||||
"Anwalt des Klägers",
|
"Anwalt des Klägers",
|
||||||
match &self.plaintiff_lawyer {
|
match &lawsuit.plaintiff_lawyer {
|
||||||
Some(lawyer) => format!("<@{}>", lawyer),
|
Some(lawyer) => format!("<@{}>", lawyer),
|
||||||
None => "TBD".to_string(),
|
None => "TBD".to_string(),
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
.field("Angeklagter", format!("<@{}>", self.accused), false)
|
.field("Angeklagter", format!("<@{}>", lawsuit.accused), false)
|
||||||
.field(
|
.field(
|
||||||
"Anwalt des Angeklagten",
|
"Anwalt des Angeklagten",
|
||||||
match &self.accused_lawyer {
|
match &lawsuit.accused_lawyer {
|
||||||
Some(lawyer) => format!("<@{}>", lawyer),
|
Some(lawyer) => format!("<@{}>", lawyer),
|
||||||
None => "TBD".to_string(),
|
None => "TBD".to_string(),
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
.field("Richter", format!("<@{}>", self.judge), false)
|
.field("Richter", format!("<@{}>", lawsuit.judge), false)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
|
|
@ -203,21 +205,19 @@ impl Lawsuit {
|
||||||
|
|
||||||
Ok(Ok(()))
|
Ok(Ok(()))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
async fn create_room(
|
async fn create_room(
|
||||||
http: &Http,
|
&self,
|
||||||
guild_id: GuildId,
|
|
||||||
room_len: usize,
|
room_len: usize,
|
||||||
category_id: SnowflakeId,
|
category_id: SnowflakeId,
|
||||||
mongo_client: &Mongo,
|
|
||||||
) -> Result<Result<CourtRoom, Response>> {
|
) -> Result<Result<CourtRoom, Response>> {
|
||||||
let room_number = room_len + 1;
|
let room_number = room_len + 1;
|
||||||
let room_name = format!("gerichtsraum-{room_number}");
|
let room_name = format!("gerichtsraum-{room_number}");
|
||||||
let role_name = format!("Gerichtsprozess {room_number}");
|
let role_name = format!("Gerichtsprozess {room_number}");
|
||||||
|
|
||||||
let guild = guild_id
|
let guild = self
|
||||||
.to_partial_guild(http)
|
.guild_id
|
||||||
|
.to_partial_guild(&self.http)
|
||||||
.await
|
.await
|
||||||
.wrap_err("fetch partial guild")?;
|
.wrap_err("fetch partial guild")?;
|
||||||
|
|
||||||
|
|
@ -225,7 +225,7 @@ async fn create_room(
|
||||||
Some(role) => role.id,
|
Some(role) => role.id,
|
||||||
None => {
|
None => {
|
||||||
guild
|
guild
|
||||||
.create_role(http, |role| {
|
.create_role(&self.http, |role| {
|
||||||
role.name(role_name).permissions(Permissions::empty())
|
role.name(role_name).permissions(Permissions::empty())
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
|
|
@ -234,7 +234,10 @@ async fn create_room(
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let channels = guild.channels(http).await.wrap_err("fetching channels")?;
|
let channels = guild
|
||||||
|
.channels(&self.http)
|
||||||
|
.await
|
||||||
|
.wrap_err("fetching channels")?;
|
||||||
|
|
||||||
let channel_id = match channels.values().find(|c| c.name() == room_name) {
|
let channel_id = match channels.values().find(|c| c.name() == room_name) {
|
||||||
Some(channel) => {
|
Some(channel) => {
|
||||||
|
|
@ -247,7 +250,7 @@ async fn create_room(
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
guild
|
guild
|
||||||
.create_channel(http, |channel| {
|
.create_channel(&self.http, |channel| {
|
||||||
channel
|
channel
|
||||||
.name(room_name)
|
.name(room_name)
|
||||||
.category(category_id)
|
.category(category_id)
|
||||||
|
|
@ -269,12 +272,13 @@ async fn create_room(
|
||||||
role_id: role_id.into(),
|
role_id: role_id.into(),
|
||||||
};
|
};
|
||||||
|
|
||||||
mongo_client
|
self.mongo_client
|
||||||
.add_court_room(guild_id.into(), &room)
|
.add_court_room(self.guild_id.into(), &room)
|
||||||
.await
|
.await
|
||||||
.wrap_err("add court room to database")?;
|
.wrap_err("add court room to database")?;
|
||||||
|
|
||||||
info!(guild_id = %guild_id, channel_id = %channel_id, "Created new court room");
|
info!(guild_id = %self.guild_id, channel_id = %channel_id, "Created new court room");
|
||||||
|
|
||||||
Ok(Ok(room))
|
Ok(Ok(room))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue