From cb672f1ee8897e4c8d95f393f0d1322565b6092e Mon Sep 17 00:00:00 2001 From: Tricked Date: Sun, 21 Apr 2024 16:14:44 +0200 Subject: [PATCH] make some part of the code prettier --- Cargo.toml | 4 - src/commands/invite_stats.rs | 9 +- src/commands/level.rs | 2 +- src/config.rs | 2 + src/event_handler.rs | 232 ++++++++++++++++++++++++++++++ src/main.rs | 264 +++-------------------------------- src/message_handler.rs | 23 +-- src/prisma.rs | 54 ++++--- 8 files changed, 298 insertions(+), 292 deletions(-) create mode 100644 src/event_handler.rs diff --git a/Cargo.toml b/Cargo.toml index 61f9ecf..5066c0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,10 +10,6 @@ default-run = "tricked-bot" [profile.release] lto = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[features] -default = [] - [dependencies] bytes = "1" futures = "0.3" diff --git a/src/commands/invite_stats.rs b/src/commands/invite_stats.rs index 57eb16b..b327970 100644 --- a/src/commands/invite_stats.rs +++ b/src/commands/invite_stats.rs @@ -3,17 +3,14 @@ use std::sync::Arc; use tokio::sync::Mutex; -use twilight_model::channel::message::Embed; -use vesper::{ - prelude::*, - twilight_exports::{InteractionResponse, InteractionResponseData, InteractionResponseType}, -}; + +use vesper::prelude::*; use crate::structs::State; #[command] #[description = "View invite stats!"] -pub async fn invite_stats(ctx: &SlashContext<'_, Arc>>) -> DefaultCommandResult { +pub async fn invite_stats(_ctx: &SlashContext<'_, Arc>>) -> DefaultCommandResult { // let data = { // let state = ctx.data.lock().await; // let mut stmt = state diff --git a/src/commands/level.rs b/src/commands/level.rs index 19edcc8..21b2908 100644 --- a/src/commands/level.rs +++ b/src/commands/level.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use prisma_client_rust::Direction; use tokio::sync::Mutex; -use twilight_model::channel::message::Embed; + use vesper::{ prelude::*, twilight_exports::{InteractionResponse, InteractionResponseData, InteractionResponseType}, diff --git a/src/config.rs b/src/config.rs index 20ac6a2..4bd0572 100644 --- a/src/config.rs +++ b/src/config.rs @@ -29,6 +29,8 @@ pub struct Config { pub status: String, #[arg(short, long, env)] pub openai_api_key: Option, + #[arg(short, long, env)] + pub today_i_channel: Option, } fn parse_str_array(src: &str) -> Result>, io::Error> { diff --git a/src/event_handler.rs b/src/event_handler.rs new file mode 100644 index 0000000..fa62578 --- /dev/null +++ b/src/event_handler.rs @@ -0,0 +1,232 @@ +use crate::{message_handler::handle_message, prisma::invite_data, structs::*}; + +use rand::Rng; +use tokio::{join, sync::Mutex}; +use twilight_gateway::Event; +use twilight_http::{request::channel::reaction::RequestReactionType, Client as HttpClient}; +use twilight_model::{ + channel::message::AllowedMentions, + gateway::presence::Status, + id::{ + marker::{ChannelMarker, UserMarker}, + Id, + }, +}; +use vesper::prelude::*; + +use std::{sync::Arc, time::Duration}; + +const AETHOR_ID: Id = Id::new(870383692403593226); +const GENERAL_ID: Id = Id::new(748957504666599507); +const TRICKED_ID: u64 = 336465356304678913; + +pub async fn handle_event( + event: Event, + http: &Arc, + state: &Arc>, + framework: Arc>>>, +) -> color_eyre::Result<()> { + let mut locked_state = state.lock().await; + match event { + Event::PresenceUpdate(p) => { + if p.user.id() == AETHOR_ID && p.status == Status::Offline { + for _ in 0..10 { + http.create_message(GENERAL_ID) + .content("AETHOR WENT OFFLINE <@{TRICKED_ID}> <@{TRICKED_ID}>")? + .allowed_mentions(Some(&AllowedMentions { + users: vec![Id::new(TRICKED_ID)], + ..Default::default() + })) + .exec() + .await?; + } + } + } + Event::InteractionCreate(i) => { + tracing::info!("Slash Command!"); + tokio::spawn(async move { + let inner = i.0; + framework.process(inner).await; + }); + } + Event::InviteCreate(inv) => { + locked_state.invites.push(BotInvite::from(inv)); + } + Event::MemberAdd(member) => { + let invites_response = http.guild_invites(member.guild_id).exec().await?; + let invites = invites_response.models().await?; + let mut invites_iter = invites.iter(); + for old_invite in locked_state.invites.iter() { + if let Some(invite) = invites_iter.find(|x| x.code == old_invite.code) { + if old_invite.uses < invite.uses.unwrap_or_default() { + let name = locked_state.config.invites.iter().find_map(|(key, value)| { + if value == &old_invite.code { + Some(key.clone()) + } else { + None + } + }); + http.create_message(Id::new(locked_state.config.join_channel)) + .content(&format!( + "{} Joined invite used {}", + member.user.name, + if let Some(name) = name { + format!("{name} ({})", invite.code) + } else { + invite.code.clone() + } + ))? + .exec() + .await?; + locked_state.db.invite_data().create( + member.user.id.get().to_string(), + vec![invite_data::SetParam::SetInviteUsed(Some(invite.code.clone()))], + ); + // Found the used invite! exit! + break; + } + } + } + locked_state.invites = invites + .into_iter() + .map(|invite| BotInvite { + code: invite.code.clone(), + uses: invite.uses.unwrap_or_default(), + }) + .collect(); + } + Event::MessageCreate(msg) => { + tracing::info!("Message received {}", &msg.content.replace('\n', "\\ ")); + + if msg.guild_id.is_none() || msg.author.bot { + return Ok(()); + } + + if let Some(today_i) = locked_state.config.today_i_channel { + if msg.channel_id == Id::new(today_i) && !msg.content.clone().to_lowercase().starts_with("today i") { + http.delete_message(msg.channel_id, msg.id).exec().await?; + return Ok(()); + } + } + + if let Some(channel_limit_duration) = locked_state.channel_bucket.limit_duration(msg.channel_id.get()) { + tracing::info!("Channel limit reached {}", channel_limit_duration.as_secs()); + return Ok(()); + } + if let Some(user_limit_duration) = locked_state.user_bucket.limit_duration(msg.author.id.get()) { + tracing::info!("User limit reached {}", user_limit_duration.as_secs()); + if Duration::from_secs(5) > user_limit_duration { + tokio::time::sleep(user_limit_duration).await; + } else { + return Ok(()); + } + }; + + let r = handle_message(&msg, locked_state, http).await; + match r { + Ok(res) => { + let Command { + embeds, + text, + reaction, + attachments, + reply, + skip, + mention, + } = res; + if skip { + return Ok(()); + } else if let Some(reaction) = reaction { + http.create_reaction( + msg.channel_id, + msg.id, + &RequestReactionType::Unicode { + name: &reaction.to_string(), + }, + ) + .exec() + .await?; + } else { + let mut req = http + .create_message(msg.channel_id) + .embeds(&embeds)? + .attachments(&attachments)?; + if let Some(text) = &text { + req = req.content(text)?; + } + + if reply { + req = req.reply(msg.id); + } + let mentions = AllowedMentions { + users: vec![msg.author.id], + ..Default::default() + }; + if mention { + req = req.allowed_mentions(Some(&mentions)); + } + + req.exec().await?; + } + } + Err(e) => { + tracing::error!("Error handling message: {:?}", e); + } + } + } + Event::Ready(_) => { + tracing::info!("Connected"); + } + Event::TypingStart(event) => { + if rand::thread_rng().gen_range(0..100) != 1 { + return Ok(()); + } + + if !locked_state + .config + .message_indicator_channels + .contains(&event.channel_id.get()) + { + return Ok(()); + } + if event.user_id.get() == locked_state.last_typer { + return Ok(()); + } + if let Some(mem) = event.member { + let (msg, _) = join!( + http.create_message(event.channel_id) + .content(&format!("{} is typing", mem.user.name))? + .exec(), + async { + if let Some(id) = locked_state.del.get(&event.channel_id) { + let _ = http + .delete_message(event.channel_id, Id::new(id.to_owned())) + .exec() + .await; + } + }, + ); + let res = msg?.model().await?; + locked_state.del.insert(event.channel_id, res.id.get()); + locked_state.last_typer = event.user_id.get(); + } + } + Event::GuildCreate(guild) => { + tracing::info!("Active in guild {}", guild.name); + let invites_response = http.guild_invites(guild.id).exec().await?; + locked_state.invites.append( + &mut invites_response + .models() + .await? + .into_iter() + .map(|invite| BotInvite { + code: invite.code.clone(), + uses: invite.uses.unwrap_or_default(), + }) + .collect(), + ); + } + _ => {} + } + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index d5d8585..ed891cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,22 +8,20 @@ )] #![forbid(anonymous_parameters)] -use crate::{message_handler::handle_message, prisma::PrismaClient, structs::*}; +use crate::{prisma::PrismaClient, structs::*}; use clap::Parser; use config::Config; use futures::stream::StreamExt; use lazy_static::lazy_static; -use prisma::invite_data; -use rand::Rng; + use reqwest::Client; -use tokio::{join, sync::Mutex}; +use tokio::sync::Mutex; use twilight_gateway::{ stream::{self, ShardEventStream}, - Config as TLConfig, Event, Shard, + Config as TLConfig, }; -use twilight_http::Client as TLClient; -use twilight_http::{request::channel::reaction::RequestReactionType, Client as HttpClient}; +use twilight_http::Client as HttpClient; use twilight_model::{ channel::message::AllowedMentions, gateway::{ @@ -35,10 +33,11 @@ use twilight_model::{ }; use vesper::prelude::*; -use std::{collections::HashMap, env, error::Error, path, sync::Arc, time::Duration}; +use std::{collections::HashMap, env, error::Error, sync::Arc}; mod commands; mod config; +mod event_handler; mod message_handler; mod prisma; mod structs; @@ -56,6 +55,7 @@ async fn main() -> color_eyre::Result<(), Box> { dotenv::dotenv().ok(); tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).init(); + let mut cfg = Config::parse(); if cfg.id == 0 { cfg.id = String::from_utf8_lossy(&base64::decode(cfg.token.split_once('.').unwrap().0).unwrap()) @@ -66,10 +66,7 @@ async fn main() -> color_eyre::Result<(), Box> { if std::fs::metadata(&cfg.database_file).is_err() { std::fs::write(&cfg.database_file, [])?; } - let db_path = format!( - "file://{}", - cfg.database_file.canonicalize()?.to_string_lossy().to_string() - ); + let db_path = format!("file://{}", cfg.database_file.canonicalize()?.to_string_lossy()); let db: PrismaClient = PrismaClient::_builder().with_url(db_path).build().await?; @@ -84,7 +81,13 @@ async fn main() -> color_eyre::Result<(), Box> { )) .build()?; - let tl_client = Arc::new(TLClient::new(config.token.clone())); + // HTTP is separate from the gateway, so create a new client. + let http = Arc::new( + HttpClient::builder() + .token(config.token.clone()) + .default_allowed_mentions(AllowedMentions::default()) + .build(), + ); let tl_config = TLConfig::new( config.token.clone(), @@ -96,7 +99,7 @@ async fn main() -> color_eyre::Result<(), Box> { | Intents::MESSAGE_CONTENT | Intents::GUILD_MESSAGE_TYPING, ); - let mut shards = stream::create_recommended(&tl_client, tl_config, |_, builder| { + let mut shards = stream::create_recommended(&http, tl_config, |_, builder| { builder .presence( UpdatePresencePayload::new( @@ -114,19 +117,10 @@ async fn main() -> color_eyre::Result<(), Box> { ) .build() }) - .await - .unwrap() + .await? .collect::>(); let mut shard_stream = ShardEventStream::new(shards.iter_mut()); - // HTTP is separate from the gateway, so create a new client. - let http = Arc::new( - HttpClient::builder() - .token(config.token.clone()) - .default_allowed_mentions(AllowedMentions::default()) - .build(), - ); - let state = Arc::new(Mutex::new(State::new( rand::thread_rng(), client, @@ -142,233 +136,17 @@ async fn main() -> color_eyre::Result<(), Box> { .build(), ); - framework - .register_guild_commands(Id::new(config.discord)) - .await - .unwrap(); + framework.register_guild_commands(Id::new(config.discord)).await?; while let Some(event) = shard_stream.next().await { let ev = event.1?; { state.lock().await.cache.update(&ev); } - let res = handle_event(ev, &http, &state, Arc::clone(&framework)).await; + let res = event_handler::handle_event(ev, &http, &state, Arc::clone(&framework)).await; if let Err(res) = res { - tracing::error!("{}", res); - } - } - Ok(()) -} - -async fn handle_event( - event: Event, - http: &Arc, - state: &Arc>, - framework: Arc>>>, -) -> Result<(), Box> { - let mut locked_state = state.lock().await; - match event { - Event::PresenceUpdate(p) => { - if p.user.id() == Id::new(870383692403593226) && p.status == Status::Offline { - for _ in 0..10 { - http.create_message(Id::new(748957504666599507)) - .content("AETHOR WENT OFFLINE <@336465356304678913> <@336465356304678913>")? - .allowed_mentions(Some(&AllowedMentions { - users: vec![Id::new(336465356304678913)], - ..Default::default() - })) - .exec() - .await?; - } - } - } - Event::InteractionCreate(i) => { - tracing::info!("Slash Command!"); - tokio::spawn(async move { - let inner = i.0; - framework.process(inner).await; - }); - } - Event::InviteCreate(inv) => { - locked_state.invites.push(BotInvite::from(inv)); - } - Event::MemberAdd(member) => { - let invites_response = http.guild_invites(member.guild_id).exec().await?; - let invites = invites_response.models().await?; - let mut invites_iter = invites.iter(); - for old_invite in locked_state.invites.iter() { - if let Some(invite) = invites_iter.find(|x| x.code == old_invite.code) { - if old_invite.uses < invite.uses.unwrap_or_default() { - let name = locked_state.config.invites.iter().find_map(|(key, value)| { - if value == &old_invite.code { - Some(key.clone()) - } else { - None - } - }); - http.create_message(Id::new(locked_state.config.join_channel)) - .content(&format!( - "{} Joined invite used {}", - member.user.name, - if let Some(name) = name { - format!("{name} ({})", invite.code) - } else { - invite.code.clone() - } - ))? - .exec() - .await?; - locked_state.db.invite_data().create( - member.user.id.get().to_string(), - vec![invite_data::SetParam::SetInviteUsed(Some(invite.code.clone()))], - ); - // locked_state.db.execute( - // "INSERT INTO users(discord_id,invite_used) VALUES(?1, ?2)", - // params![member.user.id.get(), invite.code], - // )?; - break; - } - } - } - locked_state.invites = invites - .into_iter() - .map(|invite| BotInvite { - code: invite.code.clone(), - uses: invite.uses.unwrap_or_default(), - }) - .collect(); - } - Event::MessageCreate(msg) => { - tracing::info!("Message received {}", &msg.content.replace('\n', "\\ ")); - // locked_state.last_typer = msg.id.get(); - - if msg.guild_id.is_none() || msg.author.bot { - return Ok(()); - } - - if msg.channel_id == Id::new(987096740127707196) - && !msg.content.clone().to_lowercase().starts_with("today i") - { - http.delete_message(msg.channel_id, msg.id).exec().await?; - return Ok(()); - } - - if let Some(channel_limit_duration) = locked_state.channel_bucket.limit_duration(msg.channel_id.get()) { - tracing::info!("Channel limit reached {}", channel_limit_duration.as_secs()); - return Ok(()); - } - if let Some(user_limit_duration) = locked_state.user_bucket.limit_duration(msg.author.id.get()) { - tracing::info!("User limit reached {}", user_limit_duration.as_secs()); - if Duration::from_secs(5) > user_limit_duration { - tokio::time::sleep(user_limit_duration).await; - } else { - return Ok(()); - } - }; - - let r = handle_message(&msg, locked_state, http).await; - match r { - Ok(res) => { - let Command { - embeds, - text, - reaction, - attachments, - reply, - skip, - mention, - } = res; - if skip { - return Ok(()); - } else if let Some(reaction) = reaction { - http.create_reaction( - msg.channel_id, - msg.id, - &RequestReactionType::Unicode { - name: &reaction.to_string(), - }, - ) - .exec() - .await?; - } else { - let mut req = http - .create_message(msg.channel_id) - .embeds(&embeds)? - .attachments(&attachments)?; - if let Some(text) = &text { - req = req.content(text)?; - } - - if reply { - req = req.reply(msg.id); - } - let mentions = AllowedMentions { - users: vec![msg.author.id], - ..Default::default() - }; - if mention { - req = req.allowed_mentions(Some(&mentions)); - } - - req.exec().await?; - } - } - Err(e) => { - tracing::error!("Error handling message: {:?}", e); - } - } - } - Event::Ready(_) => { - tracing::info!("Connected"); - } - Event::TypingStart(event) => { - if rand::thread_rng().gen_range(0..100) != 1 { - return Ok(()); - } - - if !locked_state - .config - .message_indicator_channels - .contains(&event.channel_id.get()) - { - return Ok(()); - } - if event.user_id.get() == locked_state.last_typer { - return Ok(()); - } - let (msg, _) = join!( - http.create_message(event.channel_id) - .content(&format!("{} is typing", event.member.unwrap().user.name))? - .exec(), - async { - if let Some(id) = locked_state.del.get(&event.channel_id) { - let _ = http - .delete_message(event.channel_id, Id::new(id.to_owned())) - .exec() - .await; - } - }, - ); - let res = msg?.model().await?; - locked_state.del.insert(event.channel_id, res.id.get()); - locked_state.last_typer = event.user_id.get(); - } - Event::GuildCreate(guild) => { - tracing::info!("Active in guild {}", guild.name); - let invites_response = http.guild_invites(guild.id).exec().await?; - locked_state.invites.append( - &mut invites_response - .models() - .await? - .into_iter() - .map(|invite| BotInvite { - code: invite.code.clone(), - uses: invite.uses.unwrap_or_default(), - }) - .collect(), - ); + tracing::error!("{:?}", res); } - _ => {} } Ok(()) } diff --git a/src/message_handler.rs b/src/message_handler.rs index 4ef545b..5b902b7 100644 --- a/src/message_handler.rs +++ b/src/message_handler.rs @@ -1,4 +1,3 @@ -use futures::lock; use openai_dive::v1::{ api::Client, models::Gpt35Engine, @@ -10,13 +9,13 @@ use rand::{ }; use tokio::sync::MutexGuard; use twilight_http::Client as HttpClient; -use twilight_model::{gateway::payload::incoming::MessageCreate, id::Id, oauth::Application}; -use vesper::twilight_exports::{ApplicationMarker, UserMarker}; +use twilight_model::{gateway::payload::incoming::MessageCreate, id::Id}; +use vesper::twilight_exports::UserMarker; use std::{error::Error, sync::Arc, time::Instant}; use crate::{ - prisma::{read_filters::StringFilter, user}, + prisma::user, structs::{Command, List, State}, utils::levels::xp_required_for_level, zalgos::zalgify_text, @@ -58,7 +57,7 @@ pub async fn handle_message( let new_xp = user.xp + xp; if new_xp >= xp_required { let new_level = level + 1; - let new_xp_required = xp_required_for_level(new_level); + let _new_xp_required = xp_required_for_level(new_level); locked_state .db .user() @@ -68,7 +67,7 @@ pub async fn handle_message( ) .exec() .await?; - tokio::time::sleep(std::time::Duration::from_millis(locked_state.rng.gen_range(1000..5000))).await; + tokio::time::sleep(std::time::Duration::from_millis(locked_state.rng.gen_range(3000..8000))).await; return Ok(Command::text(format!( "Congrats <@{}>! You are now level {}!", msg.author.id.get(), @@ -129,7 +128,7 @@ pub async fn handle_message( Ok(Command::nothing()) } - x if x.contains("im") && (x.split(' ').count() < 4) => { + x if x.contains("im") && (x.split(' ').count() < 4) && !x.contains("https://") => { let text = msg.content.split("im").last().unwrap().trim(); if text.is_empty() { return Ok(Command::nothing()); @@ -156,10 +155,14 @@ pub async fn handle_message( Ok(Command::nothing()) } _m if locked_state.config.openai_api_key.is_some() - && (locked_state.rng.gen_range(0..200) == 2 + && ( + // Random event chance + locked_state.rng.gen_range(0..200) == 2 + // Check if pinging The Trickster || _m.contains(&locked_state.config.id.to_string()) - || msg.referenced_message.clone().map(|m| m.author.id) - == Some(Id::::new(locked_state.config.id))) => + // Check if replying to bot + || msg.referenced_message.clone().map(|m| m.author.id) == Some(Id::::new(locked_state.config.id)) + ) => { let client = Client::new(locked_state.config.openai_api_key.clone().unwrap()); let name = msg.author.name.clone(); diff --git a/src/prisma.rs b/src/prisma.rs index a159f2f..8fb318f 100644 --- a/src/prisma.rs +++ b/src/prisma.rs @@ -10,13 +10,12 @@ pub async fn new_client_with_url(url: &str) -> Result for SetParam { @@ -83,9 +82,9 @@ pub mod invite_data { } } pub mod invite_used { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "invite_used"; pub struct Set(pub Option); impl From for SetParam { @@ -143,9 +142,9 @@ pub mod invite_data { } } pub mod left { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "left"; pub struct Set(pub bool); impl From for SetParam { @@ -194,9 +193,9 @@ pub mod invite_data { } } pub mod joined { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "joined"; pub struct Set(pub ::prisma_client_rust::chrono::DateTime<::prisma_client_rust::chrono::FixedOffset>); impl From for SetParam { @@ -259,9 +258,9 @@ pub mod invite_data { } } pub mod discord_id { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "discord_id"; pub struct Set(pub String); impl From for SetParam { @@ -677,13 +676,12 @@ pub mod invite_data { } } pub mod user { - use super::_prisma::*; - use super::*; + use super::{_prisma::*, *}; pub const NAME: &str = "User"; pub mod id { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "id"; pub struct Set(pub String); impl From for SetParam { @@ -741,9 +739,9 @@ pub mod user { } } pub mod level { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "level"; pub struct Set(pub i32); impl From for SetParam { @@ -810,9 +808,9 @@ pub mod user { } } pub mod xp { - use super::super::*; - use super::_prisma::*; - use super::{OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam}; + use super::{ + super::*, OrderByParam, SetParam, UncheckedSetParam, UniqueWhereParam, WhereParam, WithParam, _prisma::*, + }; pub const NAME: &str = "xp"; pub struct Set(pub i32); impl From for SetParam {