From e89aab3fd053f46a0e7c01093da60ce28ecd6e78 Mon Sep 17 00:00:00 2001 From: Demur Rumed Date: Thu, 25 Jan 2024 23:30:26 +0000 Subject: [PATCH] implement oracle for alts, add no-oracle flag --- config-sample.json | 2 +- src/rs/server/src/handlews.rs | 95 +++++++++++++++++------------------ src/rs/server/src/json.rs | 8 +++ src/rs/src/aieval.rs | 5 +- src/views/Alts.jsx | 3 +- src/views/MainMenu.jsx | 37 ++++++++++---- 6 files changed, 85 insertions(+), 65 deletions(-) diff --git a/config-sample.json b/config-sample.json index 9830b505..46dfd99b 100644 --- a/config-sample.json +++ b/config-sample.json @@ -1,5 +1,5 @@ { "listen": 8080, - "pg": "user=postgres host=localhost port=5432 database=oetg", + "pg": "user=postgres host=localhost port=5432 dbname=oetg", "certs": null } diff --git a/src/rs/server/src/handlews.rs b/src/rs/server/src/handlews.rs index dc3633f3..7894e0b1 100644 --- a/src/rs/server/src/handlews.rs +++ b/src/rs/server/src/handlews.rs @@ -145,47 +145,10 @@ where } async fn login_success(tx: &WsSender, user: &mut UserObject, client: &mut Client) { - if user.id != -1 { - if let Some(userdata) = user.data.get_mut("") { - let today = get_day(); - let oracle = userdata.oracle; - if oracle < today { - if userdata.ostreakday != today - 1 { - userdata.ostreak = 0; - } - userdata.ostreakday = 0; - userdata.ostreakday2 = today; - userdata.oracle = today; - let mut rng = rand::thread_rng(); - let ocardnymph = rng.gen_range(0..100) < 3; - if let Some(card) = etg::card::OpenSet.random_card(&mut rng, false, |card| { - (card.rarity != 4) ^ ocardnymph && (card.flag & etg::game::Flag::pillar) == 0 - }) { - let ccode = - if card.rarity == 4 { etg::card::AsShiny(card.code, true) } else { card.code }; - let curpool = - if card.rarity > 2 { &mut userdata.accountbound } else { &mut userdata.pool }; - let c = curpool.0.entry(ccode).or_default(); - *c = c.saturating_add(1); - userdata.ocard = ccode; - userdata.daily = 0; - userdata.dailymage = rng.gen_range(0..MAGE_COUNT); - userdata.dailydg = rng.gen_range(0..DG_COUNT); - } - } - } - } - if let Ok(userstr) = serde_json::to_string(&WsResponse::login(&*user)) { tx.send(Message::Text(userstr)).ok(); } - if let Some(userdata) = user.data.get_mut("") { - if userdata.daily == 0 { - userdata.daily = 128; - } - } - if let Ok(trx) = client.transaction().await { if user.id != -1 { if let Ok(bids) = @@ -1403,6 +1366,48 @@ pub async fn handle_ws( } } } + AuthMessage::oracle => { + let mut user = user.lock().await; + if let Some(userdata) = user.data.get_mut(&uname) { + let today = get_day(); + let oracle = userdata.oracle; + if oracle < today { + if userdata.ostreakday != today - 1 { + userdata.ostreak = 0; + } + userdata.ostreakday = 0; + userdata.ostreakday2 = today; + userdata.oracle = today; + let mut rng = rand::thread_rng(); + let ocardnymph = rng.gen_range(0..100) < 3; + if let Some(card) = etg::card::OpenSet.random_card(&mut rng, false, |card| { + (card.rarity != 4) ^ ocardnymph && (card.flag & etg::game::Flag::pillar) == 0 + }) { + let ccode = + if card.rarity == 4 { etg::card::AsShiny(card.code, true) } else { card.code }; + let bound = card.rarity > 2; + let curpool = + if bound { &mut userdata.accountbound } else { &mut userdata.pool }; + let c = curpool.0.entry(ccode).or_default(); + *c = c.saturating_add(1); + userdata.ocard = ccode; + userdata.daily = 128; + userdata.dailymage = rng.gen_range(0..MAGE_COUNT); + userdata.dailydg = rng.gen_range(0..DG_COUNT); + sendmsg( + &tx, + &WsResponse::oracle { + c: ccode, + bound, + mage: userdata.dailymage, + dg: userdata.dailydg, + day: today, + }, + ); + } + } + } + } AuthMessage::passchange { p } => { let mut user = user.lock().await; if p.is_empty() { @@ -2304,12 +2309,8 @@ pub async fn handle_ws( { let mut user = user.lock().await; user.auth = g.clone(); - login_success( - &tx, - &mut user, - &mut client, - ) - .await; + login_success(&tx, &mut user, &mut client) + .await; wusers.set_sockid(&name, sockid.get()); } else { let mut newuser = UserObject { @@ -2321,12 +2322,8 @@ pub async fn handle_ws( algo: HashAlgo::Sha512, data: Default::default(), }; - login_success( - &tx, - &mut newuser, - &mut client, - ) - .await; + login_success(&tx, &mut newuser, &mut client) + .await; wusers.insert( name, sockid.get(), diff --git a/src/rs/server/src/json.rs b/src/rs/server/src/json.rs index d776905d..14a36034 100644 --- a/src/rs/server/src/json.rs +++ b/src/rs/server/src/json.rs @@ -122,6 +122,7 @@ pub enum AuthMessage { cards: String, g: u16, }, + oracle, passchange { p: String, }, @@ -407,6 +408,13 @@ pub enum WsResponse<'a> { originaldata(&'a LegacyUser), #[serde(rename = "originaldata")] originaldataempty, + oracle { + c: i16, + bound: bool, + mage: u8, + dg: u8, + day: u32, + }, passchange { auth: &'a str, }, diff --git a/src/rs/src/aieval.rs b/src/rs/src/aieval.rs index 4385cc64..09e3803c 100644 --- a/src/rs/src/aieval.rs +++ b/src/rs/src/aieval.rs @@ -1162,10 +1162,7 @@ pub fn eval(ctx: &Game) -> i32 { .into_iter() .filter(|&pr| (pr != 0 && ctx.hasskill(pr, Event::Attack, Skill::freedom))) .count(); - [0, 15, 27, 36, 43, 48, 52, 55, 57, 59, 60, 61, 62] - .get(sofrs) - .cloned() - .unwrap_or(63u8) as i32 + [0, 15, 27, 36, 43, 48, 52, 55, 57, 59, 60, 61, 62].get(sofrs).cloned().unwrap_or(63u8) as i32 } else { player .permanents diff --git a/src/views/Alts.jsx b/src/views/Alts.jsx index fafdfb23..b4f6e35d 100644 --- a/src/views/Alts.jsx +++ b/src/views/Alts.jsx @@ -75,10 +75,11 @@ export default function Alts() { store.doNav(import('../views/MainMenu.jsx')); }} /> -  TODO put safeguards around Delete + {rx.alts[name].flags.join(' ')} { store.rmAlt(name); userEmit('altdelete', { name }); diff --git a/src/views/MainMenu.jsx b/src/views/MainMenu.jsx index 73270040..ea577a01 100644 --- a/src/views/MainMenu.jsx +++ b/src/views/MainMenu.jsx @@ -70,10 +70,6 @@ function logout() { store.doNav(store.Login); } -function noflags(user) { - return !user || !user.flags || !user.flags.length; -} - function hasflag(user, flag) { return user?.flags?.includes?.(flag); } @@ -82,8 +78,8 @@ export default function MainMenu(props) { const rx = store.useRx(); const foename = () => (rx.opts.foename ?? '').trim(), expectedDamageSamples = () => rx.opts.expectedDamageSamples || '4'; - const showcard = props.nymph ?? (rx.user?.daily === 0 && rx.user.ocard); + const [ocard, setocard] = createSignal(props.nymph); const [settings, setSettings] = createSignal(false); const [changepass, setChangepass] = createSignal(false); let newpass, newpass2; @@ -100,11 +96,32 @@ export default function MainMenu(props) { }; onMount(() => { - if (rx.user.daily === 0 && rx.user.ocard) { - store.updateUser({ daily: 128 }); + if ( + !hasflag(rx.user, 'no-oracle') && + ((Date.now() / 86400000) | 0) > rx.user.oracle + ) { + sock.userEmit('oracle', {}); } document.addEventListener('mousemove', resetTip); sock.setCmds({ + oracle: data => { + setocard(data.c); + const update = { + daily: 128, + pool: addcard(rx.user.pool, data.c), + dailymage: data.mage, + dailydg: data.dg, + oracle: data.day, + ostreakday: 0, + ostreakday2: data.day, + }; + if (data.bound) { + update.accountbound = addcard(rx.user.accountbound, data.c); + } else { + update.pool = addcard(rx.user.pool, data.c); + } + store.updateUser(update); + }, codecard: data => { store.doNav(import('./Reward.jsx'), { type: data.type, @@ -307,8 +324,8 @@ export default function MainMenu(props) { - {showcard ? - + {ocard() ? + : !rx.opts.hideMainchat && ( <> - {noflags(rx.user) && ( + {!rx.uname && (