Skip to content

Commit

Permalink
render flags in trade offer
Browse files Browse the repository at this point in the history
  • Loading branch information
serprex committed Jan 28, 2024
1 parent 6e4a80e commit d5d7be7
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 31 deletions.
61 changes: 32 additions & 29 deletions src/rs/server/src/handlews.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use std::borrow::Cow;
use std::collections::HashMap;
use std::collections::{HashMap, HashSet};
use std::num::NonZeroUsize;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
Expand Down Expand Up @@ -251,6 +251,28 @@ fn transmute(user: &mut UserData, oldcode: i16, newcode: i16, oldcopies: u16, ne
}
}

fn canaffordcards(pool: &Cardpool, cards: &str) -> Option<&'static str> {
let mut foetally = HashMap::<i16, u16>::new();
for (code, count) in iterraw(cards.as_bytes()) {
let c = foetally.entry(code).or_default();
if let Some(newc) = c.checked_add(count) {
*c = newc;
if pool.0.get(&code).cloned().unwrap_or(0) < newc {
return Some("Not enough cards between players");
}
} else {
return Some("Overflow in card totals");
}
}
None
}

fn flagname(flags: &HashSet<String>) -> String {
let mut flagvec = flags.iter().map(String::as_str).collect::<Vec<_>>();
flagvec.sort_unstable();
return flagvec.join("|");
}

async fn ordered_lock<'a, T>(
m1: &'a Mutex<T>,
m2: &'a Mutex<T>,
Expand Down Expand Up @@ -1223,6 +1245,7 @@ pub async fn handle_ws(
a: trade.get(0),
c: trade.get(1),
g: trade.get(2),
flags: "",
});
}
}
Expand Down Expand Up @@ -1258,8 +1281,8 @@ pub async fn handle_ws(
foeflags.sort_unstable();
let err = format!(
"Incompatible flags: {} <> {}",
userflags.join("|"),
foeflags.join("|"),
flagname(&userdata.flags),
flagname(&foedata.flags),
);
sendmsg(&tx, &WsResponse::tradecanceled {
u: &f,
Expand Down Expand Up @@ -1288,33 +1311,11 @@ pub async fn handle_ws(
if userdata.gold < -p1gdelta || foedata.gold < -p2gdelta {
err = Some("Not enough gold between players");
}
{
let mut usertally = HashMap::<i16, u16>::new();
for (code, count) in iterraw(cards.as_bytes()) {
let c = usertally.entry(code).or_default();
if let Some(newc) = c.checked_add(count) {
*c = newc;
if userdata.pool.0.get(&code).cloned().unwrap_or(0) < newc {
err = Some("Not enough cards between players");
}
} else {
err = Some("Overflow in card totals");
}
}
if err.is_none() {
err = canaffordcards(&userdata.pool, &cards)
}
{
let mut foetally = HashMap::<i16, u16>::new();
for (code, count) in iterraw(forcardsref.as_bytes()) {
let c = foetally.entry(code).or_default();
if let Some(newc) = c.checked_add(count) {
*c = newc;
if foedata.pool.0.get(&code).cloned().unwrap_or(0) < newc {
err = Some("Not enough cards between players");
}
} else {
err = Some("Overflow in card totals");
}
}
if err.is_none() {
err = canaffordcards(&foedata.pool, forcardsref);
}
if let Some(err) = err {
sendmsg(&tx, &WsResponse::tradecanceled {
Expand Down Expand Up @@ -1379,11 +1380,13 @@ pub async fn handle_ws(
values ($1, $2, $3, $4, $5, $6, $7, $8, now() + interval '1 hour') \
on conflict (user_id, for_user_id) do update set user_id = $1, for_user_id = $2, alt = $3, cards = $4, g = $5, foralt = $6, forcards = $7, forg = $8, expire_at = now() + interval '1 hour'",
params).await.is_ok() && trx.commit().await.is_ok() {
let flagname = user.data.get(&uname).map(|data| flagname(&data.flags));
sendmsg(&foesock.tx, &WsResponse::offertrade {
f: &u,
a: &uname,
c: &cards,
g: g32,
flags: if let Some(ref flagname) = flagname { flagname } else { "" },
});
}
}
Expand Down
1 change: 1 addition & 0 deletions src/rs/server/src/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ pub enum WsResponse<'a> {
a: &'a str,
c: &'a str,
g: i32,
flags: &'a str,
},
originaldata(&'a LegacyUser),
#[serde(rename = "originaldata")]
Expand Down
4 changes: 3 additions & 1 deletion src/sock.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,9 @@ const sockEvents = {
onClick={() =>
store.doNav(import('./views/Trade.jsx'), { foe: data.f })
}>
{`${data.f} offers to trade with you!`}
{`${data.f} offers to trade with you${
data.flags ? ' using ' + data.flags : ''
}!`}
</div>
));
userEmit('challrecv', { f: data.f, trade: true });
Expand Down
1 change: 0 additions & 1 deletion src/views/MainMenu.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,6 @@ export default function MainMenu(props) {
onClick={() => {
sock.userEmit('offertrade', {
f: foename(),
alt: rx.uname,
cards: '',
g: 0,
forcards: null,
Expand Down

0 comments on commit d5d7be7

Please sign in to comment.