Compare commits
2 Commits
829bf354d8
...
739b8819c7
Author | SHA1 | Date |
---|---|---|
Anna | 739b8819c7 | |
Anna | 5ef3a8c6b4 |
File diff suppressed because it is too large
Load Diff
|
@ -17,8 +17,8 @@ rayon = "1"
|
|||
serde = { version = "1", features = ["derive"] }
|
||||
serde_yaml = "0.9"
|
||||
sha3 = "0.10"
|
||||
sqlx = { version = "0.6", features = ["runtime-tokio-rustls", "sqlite", "chrono"] }
|
||||
toml = "0.7"
|
||||
sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "sqlite", "chrono"] }
|
||||
toml = "0.8"
|
||||
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
|
||||
tokio-stream = { version = "0.1", default-features = false, features = ["net"] }
|
||||
uuid = { version = "1", features = ["serde", "v4"] }
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
[toolchain]
|
||||
channel = 'nightly'
|
||||
targets = ['x86_64-unknown-linux-musl']
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(drain_filter)]
|
||||
#![feature(extract_if)]
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::net::SocketAddr;
|
||||
|
|
|
@ -53,40 +53,75 @@ async fn logic(state: Arc<State>, id: i64, location: u32, query: GetLocationQuer
|
|||
};
|
||||
|
||||
let location = location as i64;
|
||||
let mut messages = sqlx::query_as!(
|
||||
RetrievedMessage,
|
||||
// language=sqlite
|
||||
r#"
|
||||
select m.id,
|
||||
m.x,
|
||||
m.y,
|
||||
m.z,
|
||||
m.yaw,
|
||||
m.message,
|
||||
coalesce(sum(v.vote between 0 and 1), 0) as positive_votes,
|
||||
coalesce(sum(v.vote between -1 and 0), 0) as negative_votes,
|
||||
v2.vote as user_vote,
|
||||
m.glyph,
|
||||
m.created,
|
||||
m.user,
|
||||
cast((julianday(current_timestamp) - julianday(u.last_seen)) * 1440 as int) as last_seen_minutes
|
||||
from messages m
|
||||
left join votes v on m.id = v.message
|
||||
left join votes v2 on m.id = v2.message and v2.user = ?
|
||||
inner join users u on m.user = u.id
|
||||
where m.territory = ? and m.world is ? and m.ward is ? and m.plot is ?
|
||||
group by m.id"#,
|
||||
id,
|
||||
location,
|
||||
world,
|
||||
query.ward,
|
||||
query.plot,
|
||||
)
|
||||
.fetch_all(&state.db)
|
||||
.await
|
||||
.context("could not get messages from database")
|
||||
.map_err(AnyhowRejection)
|
||||
.map_err(warp::reject::custom)?;
|
||||
let mut messages = if housing {
|
||||
sqlx::query_as!(
|
||||
RetrievedMessage,
|
||||
// language=sqlite
|
||||
r#"
|
||||
select m.id,
|
||||
m.x,
|
||||
m.y,
|
||||
m.z,
|
||||
m.yaw,
|
||||
m.message,
|
||||
coalesce(sum(v.vote between 0 and 1), 0) as positive_votes,
|
||||
coalesce(sum(v.vote between -1 and 0), 0) as negative_votes,
|
||||
coalesce(v2.vote, 0) as user_vote,
|
||||
m.glyph,
|
||||
m.created,
|
||||
m.user,
|
||||
coalesce(cast((julianday(current_timestamp) - julianday(u.last_seen)) * 1440 as int), 0) as last_seen_minutes
|
||||
from messages m
|
||||
left join votes v on m.id = v.message
|
||||
left join votes v2 on m.id = v2.message and v2.user = ?
|
||||
inner join users u on m.user = u.id
|
||||
where m.territory = ? and m.world is ? and m.ward is ? and m.plot is ?
|
||||
group by m.id"#,
|
||||
id,
|
||||
location,
|
||||
world,
|
||||
query.ward,
|
||||
query.plot,
|
||||
)
|
||||
.fetch_all(&state.db)
|
||||
.await
|
||||
.context("could not get messages from database")
|
||||
.map_err(AnyhowRejection)
|
||||
.map_err(warp::reject::custom)?
|
||||
} else {
|
||||
sqlx::query_as!(
|
||||
RetrievedMessage,
|
||||
// language=sqlite
|
||||
r#"
|
||||
select m.id,
|
||||
m.x,
|
||||
m.y,
|
||||
m.z,
|
||||
m.yaw,
|
||||
m.message,
|
||||
coalesce(sum(v.vote between 0 and 1), 0) as positive_votes,
|
||||
coalesce(sum(v.vote between -1 and 0), 0) as negative_votes,
|
||||
coalesce(v2.vote, 0) as user_vote,
|
||||
m.glyph,
|
||||
m.created,
|
||||
m.user,
|
||||
coalesce(cast((julianday(current_timestamp) - julianday(u.last_seen)) * 1440 as int), 0) as last_seen_minutes
|
||||
from messages m
|
||||
left join votes v on m.id = v.message
|
||||
left join votes v2 on m.id = v2.message and v2.user = ?
|
||||
inner join users u on m.user = u.id
|
||||
where m.territory = ?
|
||||
group by m.id"#,
|
||||
id,
|
||||
location,
|
||||
)
|
||||
.fetch_all(&state.db)
|
||||
.await
|
||||
.context("could not get messages from database")
|
||||
.map_err(AnyhowRejection)
|
||||
.map_err(warp::reject::custom)?
|
||||
};
|
||||
|
||||
filter_messages(&mut messages, id);
|
||||
Ok(warp::reply::json(&messages))
|
||||
}
|
||||
|
@ -94,7 +129,7 @@ async fn logic(state: Arc<State>, id: i64, location: u32, query: GetLocationQuer
|
|||
fn filter_messages(messages: &mut Vec<RetrievedMessage>, id: i64) {
|
||||
// remove messages where the user has been offline for over 35 minutes
|
||||
// also remove messages with low score (that aren't the from the user)
|
||||
messages.drain_filter(|msg| msg.last_seen_minutes >= 35 || (msg.user != id && (msg.positive_votes - msg.negative_votes) < crate::consts::VOTE_THRESHOLD_HIDE));
|
||||
messages.retain(|msg| msg.last_seen_minutes < 35 && (msg.user == id || (msg.positive_votes - msg.negative_votes) >= crate::consts::VOTE_THRESHOLD_HIDE));
|
||||
|
||||
// shuffle messages since we'll be excluding later based on messages
|
||||
// that have already been included, so this will be more fair
|
||||
|
@ -176,5 +211,5 @@ fn filter_messages(messages: &mut Vec<RetrievedMessage>, id: i64) {
|
|||
});
|
||||
|
||||
let ids = ids.into_inner();
|
||||
messages.drain_filter(|msg| !ids.contains(&msg.id));
|
||||
messages.retain(|msg| ids.contains(&msg.id));
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ use uuid::Uuid;
|
|||
use warp::{Filter, Rejection, Reply};
|
||||
use warp::filters::BoxedFilter;
|
||||
|
||||
use crate::message::RetrievedMessageTerritory;
|
||||
use crate::State;
|
||||
use crate::web::{AnyhowRejection, WebError};
|
||||
|
||||
|
@ -37,7 +36,7 @@ async fn logic(state: Arc<State>, id: i64, message_id: Uuid) -> Result<impl Repl
|
|||
m.message,
|
||||
coalesce(sum(v.vote between 0 and 1), 0) as positive_votes,
|
||||
coalesce(sum(v.vote between -1 and 0), 0) as negative_votes,
|
||||
v2.vote as user_vote,
|
||||
coalesce(v2.vote, 0) as user_vote,
|
||||
m.glyph,
|
||||
m.created
|
||||
from messages m
|
||||
|
|
|
@ -41,7 +41,7 @@ async fn logic(state: Arc<State>, id: i64, extra: i64, mut query: HashMap<String
|
|||
m.message,
|
||||
coalesce(sum(v.vote between 0 and 1), 0) as positive_votes,
|
||||
coalesce(sum(v.vote between -1 and 0), 0) as negative_votes,
|
||||
v2.vote as user_vote,
|
||||
coalesce(v2.vote, 0) as user_vote,
|
||||
m.glyph,
|
||||
m.created,
|
||||
0 as "is_hidden: bool"
|
||||
|
|
Loading…
Reference in New Issue