From cd841f38eb0f4b588e0b3ef8b1665b50c999fe29 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:02:00 -0600 Subject: [PATCH 01/34] Whoa boy rust is a problem child --- .gitignore | 1 + secert-hitler/Cargo.lock | 84 +++ secert-hitler/Cargo.toml | 10 + secert-hitler/src/config.rs | 1 + .../src/controller/gamemaster/gamemaster.rs | 23 + secert-hitler/src/controller/mod.rs | 0 secert-hitler/src/controller/state/event.rs | 19 + .../src/controller/state/mockroom.rs | 134 +++++ .../src/controller/state/mockrooms.rs | 89 +++ secert-hitler/src/controller/state/room.rs | 14 + secert-hitler/src/controller/state/rooms.rs | 13 + secert-hitler/src/main.rs | 11 + secert-hitler/src/model/mod.rs | 0 secert-hitler/src/view/mod.rs | 0 testdata/matrix-sandbox/build.sh | 19 +- testdata/matrix-sandbox/homeserver.log | 551 ++++++++++++++++++ testdata/matrix-sandbox/synapse-test-log.yaml | 43 ++ testdata/matrix-sandbox/synapse-test.key | 1 + 18 files changed, 1005 insertions(+), 8 deletions(-) create mode 100644 secert-hitler/Cargo.lock create mode 100644 secert-hitler/Cargo.toml create mode 100644 secert-hitler/src/config.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster.rs create mode 100644 secert-hitler/src/controller/mod.rs create mode 100644 secert-hitler/src/controller/state/event.rs create mode 100644 secert-hitler/src/controller/state/mockroom.rs create mode 100644 secert-hitler/src/controller/state/mockrooms.rs create mode 100644 secert-hitler/src/controller/state/room.rs create mode 100644 secert-hitler/src/controller/state/rooms.rs create mode 100644 secert-hitler/src/main.rs create mode 100644 secert-hitler/src/model/mod.rs create mode 100644 secert-hitler/src/view/mod.rs create mode 100644 testdata/matrix-sandbox/homeserver.log create mode 100644 testdata/matrix-sandbox/synapse-test-log.yaml create mode 100644 testdata/matrix-sandbox/synapse-test.key diff --git a/.gitignore b/.gitignore index d20ab8d..efd4a88 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **/*.sw* **/*.db +**/target diff --git a/secert-hitler/Cargo.lock b/secert-hitler/Cargo.lock new file mode 100644 index 0000000..440f6fb --- /dev/null +++ b/secert-hitler/Cargo.lock @@ -0,0 +1,84 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" + +[[package]] +name = "ppv-lite86" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "secert-hitler" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" diff --git a/secert-hitler/Cargo.toml b/secert-hitler/Cargo.toml new file mode 100644 index 0000000..de858f8 --- /dev/null +++ b/secert-hitler/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "secert-hitler" +version = "0.1.0" +authors = ["bel "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rand = "*" diff --git a/secert-hitler/src/config.rs b/secert-hitler/src/config.rs new file mode 100644 index 0000000..e993cd0 --- /dev/null +++ b/secert-hitler/src/config.rs @@ -0,0 +1 @@ +pub static PORT:&str = ":8080"; diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs new file mode 100644 index 0000000..d3ad63e --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -0,0 +1,23 @@ +#[derive(Debug)] +pub struct GameMaster { + room_id: String, +} + +impl GameMaster { + fn new() -> GameMaster { + GameMaster{ + room_id: "hello".to_string(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new() { + let gm = GameMaster::new(); + println!("made: {:?}", gm); + } +} diff --git a/secert-hitler/src/controller/mod.rs b/secert-hitler/src/controller/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/secert-hitler/src/controller/state/event.rs b/secert-hitler/src/controller/state/event.rs new file mode 100644 index 0000000..b8f5492 --- /dev/null +++ b/secert-hitler/src/controller/state/event.rs @@ -0,0 +1,19 @@ +#[derive(Clone, Debug)] +pub struct Event { + pub sender: String, + pub body: String, + pub next: String, +} + +#[cfg(test)] +mod tests { + #[test] + fn event() { + let e = super::Event{ + sender: "sender".to_string(), + body: "body".to_string(), + next: "next".to_string(), + }; + println!("{:?}", e); + } +} diff --git a/secert-hitler/src/controller/state/mockroom.rs b/secert-hitler/src/controller/state/mockroom.rs new file mode 100644 index 0000000..36d01ee --- /dev/null +++ b/secert-hitler/src/controller/state/mockroom.rs @@ -0,0 +1,134 @@ +use super::room::Room; +use super::event::Event; + +use rand::{self, Rng}; +use rand::distributions::Alphanumeric; + +#[derive(Clone, Debug)] +pub struct MockRoom { + last: String, + room_id: String, + events: Vec, +} + +impl MockRoom { + pub fn create() -> MockRoom { + MockRoom::join(rands()) + } + + pub fn join(room_id: String) -> MockRoom { + MockRoom { + last: "".to_string(), + room_id: room_id, + events: vec![], + } + } + + pub fn room(&self) -> impl Room { + self.clone() + } +} + +impl Room for MockRoom { + fn sync(&mut self) -> Vec { + let mut unseen: Vec = vec![]; + let mut last = self.last.clone(); + for e in &self.events { + if e.next == self.last { + unseen.clear(); + } else { + unseen.push(e.clone()); + last = e.next.clone(); + } + } + self.last = last; + return unseen; + } + + fn send(&mut self, message: String) -> Result<&str, &str> { + let e = Event{ + sender: rands(), + next: rands(), + body: message, + }; + self.events.push(e); + Ok("ok") + } + + fn room_id(&self) -> String { + self.room_id.clone() + } +} + +pub fn rands() -> String { + rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(10) + .collect::() +} + +#[cfg(test)] +mod tests { + use super::Room; + use super::MockRoom; + use super::Event; + use super::rands; + + fn _dummy() -> MockRoom { + let mut r = MockRoom::create(); + r.last = "1".to_string(); + r.events = vec![]; + for i in 0..5 { + r.events.push(Event{ + sender: i.to_string(), + next: i.to_string(), + body: i.to_string(), + }); + } + r + } + + #[test] + fn randstest() { + let a = rands(); + let b = rands(); + assert!(a != b, "a == {} == b == {}", a, b); + } + + #[test] + fn create() { + let mut r: MockRoom = MockRoom::create(); + println!("{:?}", r.sync()); + } + + #[test] + fn join() { + let rid = "a".to_string(); + let r: MockRoom = MockRoom::join(rid.to_string()); + assert!(r.room_id == rid); + } + + #[test] + fn sync() { + let mut r = _dummy(); + let events = r.sync(); + assert!(events.len() == 3, "want {}, got {}: {:?}", 3, events.len(), events); + assert!(events[0].sender == "2"); + assert!(events[0].body == "2"); + assert!(events[0].next == "2"); + assert!(r.last == "4", "want last==4, got {}", r.last); + } + + #[test] + fn send() { + let mut r = _dummy(); + let message = "message".to_string(); + r.sync(); + assert!(r.send(message.clone()).ok().unwrap() == "ok"); + assert!(r.last == "4"); + let events = r.sync(); + assert!(events.len() == 1); + assert!(events[0].body == message, "want {}, got {}: {:?}", message, events[0].body, events); + assert!(r.last != "4"); + } +} diff --git a/secert-hitler/src/controller/state/mockrooms.rs b/secert-hitler/src/controller/state/mockrooms.rs new file mode 100644 index 0000000..963aa5f --- /dev/null +++ b/secert-hitler/src/controller/state/mockrooms.rs @@ -0,0 +1,89 @@ +use super::rooms::Rooms; +use super::room::Room; +use super::mockroom::MockRoom; + +// #[derive(Clone, Debug)] +pub struct MockRooms { + rooms: Vec, +} + +impl MockRooms { + pub fn new() -> MockRooms { + MockRooms { + rooms: vec![], + } + } +} + +impl Rooms for MockRooms { + fn create(&mut self) -> Box { + let room = MockRoom::create(); + let _room = room.room(); + self.rooms.push(room); + Box::new(_room) + } + + fn join(&self, room_id: String) -> Result, &str> { + for r in &self.rooms { + if r.room_id() == room_id { + return Ok(Box::new(r.room())); + } + } + Err("not found") + } +} + +#[cfg(test)] +mod tests { + use super::MockRooms; + use super::MockRoom; + use super::Rooms; + + fn _dummy() -> MockRooms { + let mut mrs = MockRooms::new(); + for i in 0..5 { + let random = MockRoom::create(); + mrs.rooms.push(random); + let joined = MockRoom::join(i.to_string()); + mrs.rooms.push(joined); + } + assert!(mrs.rooms.len() == 10); + mrs + } + + #[test] + fn mockrooms() { + let mrs = MockRooms::new(); + assert!(mrs.rooms.len() == 0); + } + + #[test] + fn create() { + let mut mrs = _dummy(); + let was = mrs.rooms.len(); + let _ = mrs.create(); + let is = mrs.rooms.len(); + assert!(was+1 == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); + } + + #[test] + fn join_404() { + let mrs = _dummy(); + let was = mrs.rooms.len(); + let r = mrs.join("does not exist".to_string()); + let is = mrs.rooms.len(); + assert!(was == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); + assert!(!r.is_ok()); + } + + #[test] + fn join_found() { + let mrs = _dummy(); + let was = mrs.rooms.len(); + let r = mrs.join("0".to_string()); + let is = mrs.rooms.len(); + assert!(was == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); + assert!(r.is_ok()); + assert!(r.ok().unwrap().room_id() == "0"); + } +} diff --git a/secert-hitler/src/controller/state/room.rs b/secert-hitler/src/controller/state/room.rs new file mode 100644 index 0000000..8d7b354 --- /dev/null +++ b/secert-hitler/src/controller/state/room.rs @@ -0,0 +1,14 @@ +use super::event; + +pub trait Room { + fn sync(&mut self) -> Vec; + fn send(&mut self, message: String) -> Result<&str, &str>; + fn room_id(&self) -> String; +} + +#[cfg(test)] +mod tests { + #[test] + fn room() { + } +} diff --git a/secert-hitler/src/controller/state/rooms.rs b/secert-hitler/src/controller/state/rooms.rs new file mode 100644 index 0000000..f417088 --- /dev/null +++ b/secert-hitler/src/controller/state/rooms.rs @@ -0,0 +1,13 @@ +use super::room::Room; + +pub trait Rooms { + fn create(&mut self) -> Box; + fn join(&self, room_id: String) -> Result, &str>; +} + +#[cfg(test)] +mod tests { + #[test] + fn rooms() { + } +} diff --git a/secert-hitler/src/main.rs b/secert-hitler/src/main.rs new file mode 100644 index 0000000..5f819e9 --- /dev/null +++ b/secert-hitler/src/main.rs @@ -0,0 +1,11 @@ +mod config; +#[path = "./controller/gamemaster/gamemaster.rs"] mod gamemaster; +#[path = "./controller/state/event.rs"] mod event; +#[path = "./controller/state/room.rs"] mod room; +#[path = "./controller/state/rooms.rs"] mod rooms; +#[path = "./controller/state/mockroom.rs"] mod mockroom; +#[path = "./controller/state/mockrooms.rs"] mod mockrooms; + +fn main() { + println!("{}", config::PORT); +} diff --git a/secert-hitler/src/model/mod.rs b/secert-hitler/src/model/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/secert-hitler/src/view/mod.rs b/secert-hitler/src/view/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/testdata/matrix-sandbox/build.sh b/testdata/matrix-sandbox/build.sh index bea59f2..dc4e997 100644 --- a/testdata/matrix-sandbox/build.sh +++ b/testdata/matrix-sandbox/build.sh @@ -1,7 +1,10 @@ #! /bin/bash if ! ps aux | grep -v grep | grep homeserver; then - homeserver -c config.yaml & + cp synapse-test.key /tmp/ + cp synapse-test-log.yaml /tmp/ + homeserver -c config.yaml &> /tmp/synapse-test.log & + disown fi # pick a username @@ -9,7 +12,7 @@ username="$(cat /proc/sys/kernel/random/uuid)" # register out="$( - curl -sS http://192.168.0.86:39487/_matrix/client/r0/register \ + curl -sS http://localhost:39487/_matrix/client/r0/register \ -X POST \ -H 'content-type: application/json' \ -d "$( @@ -31,7 +34,7 @@ home_server="$(echo "$out" | jq -r .home_server)" room="$(cat /proc/sys/kernel/random/uuid)" out="$( - curl -sS http://192.168.0.86:39487/_matrix/client/r0/createRoom\ + curl -sS http://localhost:39487/_matrix/client/r0/createRoom\ -X POST \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -46,7 +49,7 @@ room_id="$(echo "$out" | jq -r .room_id)" # join a room by name # curl -XPOST -d '{}' "https://localhost:8448/_matrix/client/r0/join/%21asfLdzLnOdGRkdPZWu:localhost?access_token=YOUR_ACCESS_TOKEN" -curl -sS "http://192.168.0.86:39487/_matrix/client/r0/join/$room_id" \ +curl -sS "http://localhost:39487/_matrix/client/r0/join/$room_id" \ -X POST \ -H 'Authorization: Bearer '"$access_token" \ -d '{}' @@ -58,7 +61,7 @@ txid="$(cat /proc/sys/kernel/random/uuid)" message="hello wurl" out="$( - curl -sS "http://192.168.0.86:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ + curl -sS "http://localhost:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ -X PUT \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -74,7 +77,7 @@ printf "%s\n" "$out" # get recent messages # curl --globoff -XGET 'https://localhost:8448/_matrix/client/r0/sync?filter={"room":{"timeline":{"limit":1}}}&access_token=YOUR_ACCESS_TOKEN' out="$( - curl -sS "http://192.168.0.86:39487/_matrix/client/r0/sync" \ + curl -sS "http://localhost:39487/_matrix/client/r0/sync" \ -X GET \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -89,7 +92,7 @@ txid="$(cat /proc/sys/kernel/random/uuid)" message="hello wurl2" out="$( - curl -sS "http://192.168.0.86:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ + curl -sS "http://localhost:39487/_matrix/client/r0/rooms/$room_id/send/m.room.message/$txid" \ -X PUT \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ @@ -104,7 +107,7 @@ printf "%s\n" "$out" # get second recent messages # curl --globoff -XGET 'https://localhost:8448/_matrix/client/r0/sync?filter={"room":{"timeline":{"limit":1}}}&access_token=YOUR_ACCESS_TOKEN' -curl -sS "http://192.168.0.86:39487/_matrix/client/r0/sync?since=$since" \ +curl -sS "http://localhost:39487/_matrix/client/r0/sync?since=$since" \ -X GET \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ diff --git a/testdata/matrix-sandbox/homeserver.log b/testdata/matrix-sandbox/homeserver.log new file mode 100644 index 0000000..829897a --- /dev/null +++ b/testdata/matrix-sandbox/homeserver.log @@ -0,0 +1,551 @@ +2020-05-02 07:19:16,961 - twisted - 192 - INFO - None - Redirected stdout/stderr to logs +2020-05-02 07:19:16,961 - root - 257 - WARNING - None - ***** STARTING SERVER ***** +2020-05-02 07:19:16,961 - root - 258 - WARNING - None - Server /nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/bin/homeserver version 1.12.1 +2020-05-02 07:19:16,961 - root - 259 - INFO - None - Server hostname: 192.168.0.86 +2020-05-02 07:19:16,961 - synapse.app.homeserver - 346 - INFO - None - Setting up server +2020-05-02 07:19:16,961 - synapse.server - 240 - INFO - None - Setting up. +2020-05-02 07:19:16,962 - synapse.storage.data_stores - 48 - INFO - None - Preparing database 'master'... +2020-05-02 07:19:21,541 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v55 +2020-05-02 07:19:21,542 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 55/access_token_expiry.sql +2020-05-02 07:19:21,548 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 55/track_threepid_validations.sql +2020-05-02 07:19:21,551 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 55/users_alter_deactivated.sql +2020-05-02 07:19:21,556 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v56 +2020-05-02 07:19:21,559 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/add_spans_to_device_lists.sql +2020-05-02 07:19:21,564 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/current_state_events_membership.sql +2020-05-02 07:19:21,570 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/current_state_events_membership_mk2.sql +2020-05-02 07:19:21,571 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/delete_keys_from_deleted_backups.sql +2020-05-02 07:19:21,572 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/destinations_failure_ts.sql +2020-05-02 07:19:21,577 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/device_stream_id_insert.sql +2020-05-02 07:19:21,578 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/devices_last_seen.sql +2020-05-02 07:19:21,584 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/drop_unused_event_tables.sql +2020-05-02 07:19:21,585 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/event_expiry.sql +2020-05-02 07:19:21,586 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/event_labels.sql +2020-05-02 07:19:21,587 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/event_labels_background_update.sql +2020-05-02 07:19:21,587 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/fix_room_keys_index.sql +2020-05-02 07:19:21,588 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/hidden_devices.sql +2020-05-02 07:19:21,589 - synapse.storage.prepare_database - 404 - INFO - None - Applying engine-specific schema 56/hidden_devices_fix.sql.sqlite +2020-05-02 07:19:21,596 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/nuke_empty_communities_from_db.sql +2020-05-02 07:19:21,597 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/public_room_list_idx.sql +2020-05-02 07:19:21,597 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/redaction_censor.sql +2020-05-02 07:19:21,598 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/redaction_censor2.sql +2020-05-02 07:19:21,600 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/redaction_censor4.sql +2020-05-02 07:19:21,600 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/remove_tombstoned_rooms_from_directory.sql +2020-05-02 07:19:21,600 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/room_key_etag.sql +2020-05-02 07:19:21,602 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/room_membership_idx.sql +2020-05-02 07:19:21,603 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/room_retention.sql +2020-05-02 07:19:21,603 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/signing_keys.sql +2020-05-02 07:19:21,604 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/signing_keys_nonunique_signatures.sql +2020-05-02 07:19:21,604 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/state_group_room_idx.sql +2020-05-02 07:19:21,605 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/stats_separated.sql +2020-05-02 07:19:21,607 - synapse.storage.prepare_database - 389 - INFO - None - Running script 56/unique_user_filter_index.py +2020-05-02 07:19:21,704 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/user_external_ids.sql +2020-05-02 07:19:21,706 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/users_in_public_rooms_idx.sql +2020-05-02 07:19:21,707 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v57 +2020-05-02 07:19:21,708 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 57/delete_old_current_state_events.sql +2020-05-02 07:19:21,709 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 57/device_list_remote_cache_stale.sql +2020-05-02 07:19:21,711 - synapse.storage.prepare_database - 389 - INFO - None - Running script 57/local_current_membership.py +2020-05-02 07:19:21,713 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 57/rooms_version_column.sql +2020-05-02 07:19:21,719 - synapse.storage.prepare_database - 404 - INFO - None - Applying engine-specific schema 57/rooms_version_column_2.sql.sqlite +2020-05-02 07:19:21,720 - synapse.storage.prepare_database - 404 - INFO - None - Applying engine-specific schema 57/rooms_version_column_3.sql.sqlite +2020-05-02 07:19:21,744 - synapse.storage.data_stores - 58 - INFO - None - Starting 'main' data store +2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - None - Searching for stream ordering 1 month ago +2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - None - Found stream ordering 1 month ago: it's 0 +2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - None - Searching for stream ordering 1 day ago +2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - None - Found stream ordering 1 day ago: it's 0 +2020-05-02 07:19:21,754 - synapse.storage.data_stores - 68 - INFO - None - Starting 'state' data store +2020-05-02 07:19:21,755 - synapse.storage.data_stores - 81 - INFO - None - Database 'master' prepared +2020-05-02 07:19:21,756 - synapse.server - 243 - INFO - None - Finished setting up. +2020-05-02 07:19:21,779 - synapse.app.homeserver - 110 - INFO - - Running +2020-05-02 07:19:21,779 - synapse.app.homeserver - 30 - INFO - - Set file limit to: 4096 +2020-05-02 07:19:21,781 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'profile' +2020-05-02 07:19:21,782 - synapse.push.pusher - 42 - INFO - - email enable notifs: False +2020-05-02 07:19:21,785 - synapse.handlers.auth - 89 - INFO - - Extra password_providers: [] +2020-05-02 07:19:21,786 - synapse.push.mailer - 686 - INFO - - loading email templates ['sso_redirect_confirm.html'] from '/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/res/templates' +2020-05-02 07:19:21,788 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.device_list_update' +2020-05-02 07:19:21,788 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'directory' +2020-05-02 07:19:21,798 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.presence' +2020-05-02 07:19:21,798 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.typing' +2020-05-02 07:19:21,800 - synapse.handlers.deactivate_account - 186 - INFO - user_parter_loop-0 - Starting user parter +2020-05-02 07:19:21,801 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.receipt' +2020-05-02 07:19:21,802 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'org.matrix.signing_key_update' +2020-05-02 07:19:21,802 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'client_keys' +2020-05-02 07:19:21,802 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.direct_to_device' +2020-05-02 07:19:21,812 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/api/v1' +2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/r0' +2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/unstable' +2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/v2_alpha' +2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/versions' +2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/.well-known/matrix/client' +2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_synapse/admin' +2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching FilePath('/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/static') to path b'/_matrix/static' +2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/r0' +2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/v1' +2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/federation' +2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/key/v2' +2020-05-02 07:19:21,814 - twisted - 192 - INFO - - SynapseSite starting on 39487 +2020-05-02 07:19:21,814 - synapse.app.homeserver - 163 - INFO - - Synapse now listening on TCP port 39487 +2020-05-02 07:19:21,840 - synapse.storage.background_updates - 102 - INFO - background_updates-0 - Starting background schema updates +2020-05-02 07:19:21,840 - synapse.handlers.deactivate_account - 196 - INFO - user_parter_loop-0 - User parter finished: stopping +2020-05-02 07:19:21,841 - synapse.push.pusherpool - 268 - INFO - start_pushers-0 - Started pushers +2020-05-02 07:19:22,843 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'users_set_deactivated_flag' +2020-05-02 07:19:22,861 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'users_set_deactivated_flag'. Processed 0 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:23,862 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'current_state_events_membership' +2020-05-02 07:19:23,879 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'current_state_events_membership'. Processed 0 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:24,880 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'devices_last_seen' +2020-05-02 07:19:24,898 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'devices_last_seen'. Processed 0 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:25,899 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'event_store_labels' +2020-05-02 07:19:25,927 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'event_store_labels'. Processed 0 items in 26ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:26,929 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'redactions_received_ts' +2020-05-02 07:19:26,945 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'redactions_received_ts'. Processed 0 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:27,947 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'redactions_have_censored_ts_idx' +2020-05-02 07:19:27,949 - synapse.storage.background_updates - 396 - INFO - background_updates-0 - Adding index redactions_have_censored_ts to redactions +2020-05-02 07:19:27,980 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'redactions_have_censored_ts_idx'. Processed 1 items in 31ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:28,982 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'remove_tombstoned_rooms_from_directory' +2020-05-02 07:19:28,999 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'remove_tombstoned_rooms_from_directory'. Processed 0 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:30,000 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'room_membership_forgotten_idx' +2020-05-02 07:19:30,003 - synapse.storage.background_updates - 396 - INFO - background_updates-0 - Adding index room_memberships_user_room_forgotten to room_memberships +2020-05-02 07:19:30,034 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'room_membership_forgotten_idx'. Processed 1 items in 32ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:31,035 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'insert_room_retention' +2020-05-02 07:19:31,052 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'insert_room_retention'. Processed 100 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:32,054 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'state_groups_room_id_idx' +2020-05-02 07:19:32,057 - synapse.storage.background_updates - 396 - INFO - background_updates-0 - Adding index state_groups_room_id_idx to state_groups +2020-05-02 07:19:32,088 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'state_groups_room_id_idx'. Processed 1 items in 31ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:33,090 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'populate_stats_process_rooms' +2020-05-02 07:19:33,107 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'populate_stats_process_rooms'. Processed 1 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:34,108 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'add_rooms_room_version_column' +2020-05-02 07:19:34,126 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'add_rooms_room_version_column'. Processed 100 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:35,129 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'populate_stats_process_users' +2020-05-02 07:19:35,145 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'populate_stats_process_users'. Processed 1 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:36,146 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'delete_old_current_state_events' +2020-05-02 07:19:36,164 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'delete_old_current_state_events'. Processed 100 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) +2020-05-02 07:19:37,167 - synapse.storage.background_updates - 116 - INFO - background_updates-0 - No more background updates to do. Unscheduling background update task. +2020-05-02 07:21:12,311 - twisted - 192 - INFO - None - Redirected stdout/stderr to logs +2020-05-02 07:21:12,311 - root - 257 - WARNING - None - ***** STARTING SERVER ***** +2020-05-02 07:21:12,311 - root - 258 - WARNING - None - Server /nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/bin/homeserver version 1.12.1 +2020-05-02 07:21:12,311 - root - 259 - INFO - None - Server hostname: 192.168.0.86 +2020-05-02 07:21:12,311 - synapse.app.homeserver - 346 - INFO - None - Setting up server +2020-05-02 07:21:12,311 - synapse.server - 240 - INFO - None - Setting up. +2020-05-02 07:21:12,312 - synapse.storage.data_stores - 48 - INFO - None - Preparing database 'master'... +2020-05-02 07:21:12,314 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v57 +2020-05-02 07:21:12,316 - synapse.storage.data_stores - 58 - INFO - None - Starting 'main' data store +2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - None - Searching for stream ordering 1 month ago +2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - None - Found stream ordering 1 month ago: it's 0 +2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - None - Searching for stream ordering 1 day ago +2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - None - Found stream ordering 1 day ago: it's 0 +2020-05-02 07:21:12,320 - synapse.storage.data_stores - 68 - INFO - None - Starting 'state' data store +2020-05-02 07:21:12,320 - synapse.storage.data_stores - 81 - INFO - None - Database 'master' prepared +2020-05-02 07:21:12,320 - synapse.server - 243 - INFO - None - Finished setting up. +2020-05-02 07:21:12,335 - synapse.app.homeserver - 110 - INFO - - Running +2020-05-02 07:21:12,335 - synapse.app.homeserver - 30 - INFO - - Set file limit to: 4096 +2020-05-02 07:21:12,337 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'profile' +2020-05-02 07:21:12,338 - synapse.push.pusher - 42 - INFO - - email enable notifs: False +2020-05-02 07:21:12,341 - synapse.handlers.auth - 89 - INFO - - Extra password_providers: [] +2020-05-02 07:21:12,341 - synapse.push.mailer - 686 - INFO - - loading email templates ['sso_redirect_confirm.html'] from '/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/res/templates' +2020-05-02 07:21:12,344 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.device_list_update' +2020-05-02 07:21:12,344 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'directory' +2020-05-02 07:21:12,352 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.presence' +2020-05-02 07:21:12,352 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.typing' +2020-05-02 07:21:12,354 - synapse.handlers.deactivate_account - 186 - INFO - user_parter_loop-0 - Starting user parter +2020-05-02 07:21:12,355 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.receipt' +2020-05-02 07:21:12,355 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'org.matrix.signing_key_update' +2020-05-02 07:21:12,355 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'client_keys' +2020-05-02 07:21:12,356 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.direct_to_device' +2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/api/v1' +2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/r0' +2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/unstable' +2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/v2_alpha' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/versions' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/.well-known/matrix/client' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_synapse/admin' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching FilePath('/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/static') to path b'/_matrix/static' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/r0' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/v1' +2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/federation' +2020-05-02 07:21:12,368 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/key/v2' +2020-05-02 07:21:12,368 - twisted - 192 - INFO - - SynapseSite starting on 39487 +2020-05-02 07:21:12,368 - synapse.app.homeserver - 163 - INFO - - Synapse now listening on TCP port 39487 +2020-05-02 07:21:12,393 - synapse.storage.background_updates - 102 - INFO - background_updates-0 - Starting background schema updates +2020-05-02 07:21:12,393 - synapse.handlers.deactivate_account - 196 - INFO - user_parter_loop-0 - User parter finished: stopping +2020-05-02 07:21:12,394 - synapse.push.pusherpool - 268 - INFO - start_pushers-0 - Started pushers +2020-05-02 07:21:13,396 - synapse.storage.background_updates - 116 - INFO - background_updates-0 - No more background updates to do. Unscheduling background update task. +2020-05-02 07:22:59,726 - synapse.handlers.auth - 323 - INFO - POST-0 - Auth completed with creds: {'m.login.dummy': True}. Client dict has keys: ['username', 'password'] +2020-05-02 07:22:59,794 - synapse.handlers.auth - 526 - INFO - POST-0 - Logging in user @a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86 on device FNJPXRYPIB +2020-05-02 07:22:59,817 - synapse.access.http.39487 - 302 - INFO - POST-0 - ::1 - 39487 - {None} Processed request: 0.093sec/0.001sec (0.019sec, 0.000sec) (0.007sec/0.060sec/11) 472B 200 "POST /_matrix/client/r0/register HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:00,005 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:23:00,538 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:23:00,715 - synapse.access.http.39487 - 302 - INFO - POST-1 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.835sec/0.000sec (0.091sec, 0.011sec) (0.341sec/0.147sec/40) 126B 200 "POST /_matrix/client/r0/createRoom HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:00,797 - synapse.access.http.39487 - 302 - INFO - POST-2 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.062sec/0.001sec (0.003sec, 0.000sec) (0.040sec/0.013sec/6) 54B 200 "POST /_matrix/client/r0/join/!qXGPZxkFUrZujySLCj:192.168.0.86 HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:00,879 - synapse.access.http.39487 - 302 - INFO - PUT-3 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.048sec/0.001sec (0.009sec, 0.000sec) (0.002sec/0.001sec/2) 67B 200 "PUT /_matrix/client/r0/rooms/!qXGPZxkFUrZujySLCj:192.168.0.86/send/m.room.message/6432825e-924a-4af8-a8ad-00a2323515e4 HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:01,026 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:23:01,035 - synapse.access.http.39487 - 302 - INFO - GET-4 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.122sec/0.000sec (0.022sec, 0.000sec) (0.045sec/0.030sec/19) 21309B 200 "GET /_matrix/client/r0/sync HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:01,077 - synapse.access.http.39487 - 302 - INFO - PUT-5 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.023sec/0.001sec (0.000sec, 0.000sec) (0.001sec/0.000sec/2) 67B 200 "PUT /_matrix/client/r0/rooms/!qXGPZxkFUrZujySLCj:192.168.0.86/send/m.room.message/c3e7de47-3353-493f-87b3-36ee93c925a8 HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:01,127 - synapse.access.http.39487 - 302 - INFO - GET-6 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.035sec/0.001sec (0.008sec, 0.000sec) (0.022sec/0.001sec/1) 1788B 200 "GET /_matrix/client/r0/sync?since=s8_3_0_1_1_1_1_2_1 HTTP/1.1" "curl/7.58.0" [0 dbevts] +2020-05-02 07:23:12,354 - synapse.handlers.presence - 256 - INFO - persist_presence_changes-0 - Persisting 1 unpersisted presence updates +2020-05-02 07:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-0 - Calling _generate_user_daily_visits +2020-05-02 07:26:42,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:31:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-0 - Searching for stream ordering 1 month ago +2020-05-02 07:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-0 - Found stream ordering 1 month ago: it's 2 +2020-05-02 07:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-0 - Searching for stream ordering 1 day ago +2020-05-02 07:31:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-0 - Found stream ordering 1 day ago: it's 2 +2020-05-02 07:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-1 - Calling _generate_user_daily_visits +2020-05-02 07:32:42,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-2 - Calling _generate_user_daily_visits +2020-05-02 07:38:27,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-1 - Searching for stream ordering 1 month ago +2020-05-02 07:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-1 - Found stream ordering 1 month ago: it's 2 +2020-05-02 07:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-1 - Searching for stream ordering 1 day ago +2020-05-02 07:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-1 - Found stream ordering 1 day ago: it's 2 +2020-05-02 07:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-3 - Calling _generate_user_daily_visits +2020-05-02 07:44:27,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-4 - Calling _generate_user_daily_visits +2020-05-02 07:50:12,360 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-0 - Rotating notifications +2020-05-02 07:51:12,328 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-2 - Searching for stream ordering 1 month ago +2020-05-02 07:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-2 - Found stream ordering 1 month ago: it's 2 +2020-05-02 07:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-2 - Searching for stream ordering 1 day ago +2020-05-02 07:51:12,331 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-2 - Found stream ordering 1 day ago: it's 2 +2020-05-02 07:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-0 - Rotating notifications up to: 2 +2020-05-02 07:51:12,334 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-0 - Rotating notifications, handling 0 rows +2020-05-02 07:51:12,336 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-0 - Rotating notifications, deleted 0 push actions +2020-05-02 07:51:12,355 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-5 - Calling _generate_user_daily_visits +2020-05-02 07:55:47,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 07:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-6 - Calling _generate_user_daily_visits +2020-05-02 08:01:12,323 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-3 - Searching for stream ordering 1 month ago +2020-05-02 08:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-3 - Found stream ordering 1 month ago: it's 2 +2020-05-02 08:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-3 - Searching for stream ordering 1 day ago +2020-05-02 08:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-3 - Found stream ordering 1 day ago: it's 2 +2020-05-02 08:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-7 - Calling _generate_user_daily_visits +2020-05-02 08:01:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-8 - Calling _generate_user_daily_visits +2020-05-02 08:07:12,362 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:07:12,370 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 08:11:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-4 - Searching for stream ordering 1 month ago +2020-05-02 08:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-4 - Found stream ordering 1 month ago: it's 2 +2020-05-02 08:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-4 - Searching for stream ordering 1 day ago +2020-05-02 08:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-4 - Found stream ordering 1 day ago: it's 2 +2020-05-02 08:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-9 - Calling _generate_user_daily_visits +2020-05-02 08:12:02,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:16:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-10 - Calling _generate_user_daily_visits +2020-05-02 08:17:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:21:12,320 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-1 - Rotating notifications +2020-05-02 08:21:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-5 - Searching for stream ordering 1 month ago +2020-05-02 08:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-5 - Found stream ordering 1 month ago: it's 2 +2020-05-02 08:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-5 - Searching for stream ordering 1 day ago +2020-05-02 08:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-5 - Found stream ordering 1 day ago: it's 2 +2020-05-02 08:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-1 - Rotating notifications up to: 2 +2020-05-02 08:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-1 - Rotating notifications, handling 0 rows +2020-05-02 08:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-1 - Rotating notifications, deleted 0 push actions +2020-05-02 08:21:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-11 - Calling _generate_user_daily_visits +2020-05-02 08:23:27,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-12 - Calling _generate_user_daily_visits +2020-05-02 08:29:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:31:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-6 - Searching for stream ordering 1 month ago +2020-05-02 08:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-6 - Found stream ordering 1 month ago: it's 2 +2020-05-02 08:31:12,335 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-6 - Searching for stream ordering 1 day ago +2020-05-02 08:31:12,337 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-6 - Found stream ordering 1 day ago: it's 2 +2020-05-02 08:31:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-13 - Calling _generate_user_daily_visits +2020-05-02 08:35:17,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-14 - Calling _generate_user_daily_visits +2020-05-02 08:41:07,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:41:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-7 - Searching for stream ordering 1 month ago +2020-05-02 08:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-7 - Found stream ordering 1 month ago: it's 2 +2020-05-02 08:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-7 - Searching for stream ordering 1 day ago +2020-05-02 08:41:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-7 - Found stream ordering 1 day ago: it's 2 +2020-05-02 08:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-15 - Calling _generate_user_daily_visits +2020-05-02 08:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-16 - Calling _generate_user_daily_visits +2020-05-02 08:46:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-2 - Rotating notifications +2020-05-02 08:51:12,327 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-8 - Searching for stream ordering 1 month ago +2020-05-02 08:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-8 - Found stream ordering 1 month ago: it's 2 +2020-05-02 08:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-8 - Searching for stream ordering 1 day ago +2020-05-02 08:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-8 - Found stream ordering 1 day ago: it's 2 +2020-05-02 08:51:12,332 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-2 - Rotating notifications up to: 2 +2020-05-02 08:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-2 - Rotating notifications, handling 0 rows +2020-05-02 08:51:12,334 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-2 - Rotating notifications, deleted 0 push actions +2020-05-02 08:51:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-17 - Calling _generate_user_daily_visits +2020-05-02 08:52:42,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 08:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-18 - Calling _generate_user_daily_visits +2020-05-02 08:58:37,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-9 - Searching for stream ordering 1 month ago +2020-05-02 09:01:12,322 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-9 - Found stream ordering 1 month ago: it's 2 +2020-05-02 09:01:12,322 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-9 - Searching for stream ordering 1 day ago +2020-05-02 09:01:12,322 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-9 - Found stream ordering 1 day ago: it's 2 +2020-05-02 09:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-19 - Calling _generate_user_daily_visits +2020-05-02 09:04:17,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-20 - Calling _generate_user_daily_visits +2020-05-02 09:10:12,362 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:10:12,370 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 09:11:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-10 - Searching for stream ordering 1 month ago +2020-05-02 09:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-10 - Found stream ordering 1 month ago: it's 2 +2020-05-02 09:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-10 - Searching for stream ordering 1 day ago +2020-05-02 09:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-10 - Found stream ordering 1 day ago: it's 2 +2020-05-02 09:11:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-21 - Calling _generate_user_daily_visits +2020-05-02 09:15:07,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-22 - Calling _generate_user_daily_visits +2020-05-02 09:20:52,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:21:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-3 - Rotating notifications +2020-05-02 09:21:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-11 - Searching for stream ordering 1 month ago +2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-11 - Found stream ordering 1 month ago: it's 2 +2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-11 - Searching for stream ordering 1 day ago +2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-11 - Found stream ordering 1 day ago: it's 2 +2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-3 - Rotating notifications up to: 2 +2020-05-02 09:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-3 - Rotating notifications, handling 0 rows +2020-05-02 09:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-3 - Rotating notifications, deleted 0 push actions +2020-05-02 09:21:12,338 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-23 - Calling _generate_user_daily_visits +2020-05-02 09:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-24 - Calling _generate_user_daily_visits +2020-05-02 09:26:12,362 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:31:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-12 - Searching for stream ordering 1 month ago +2020-05-02 09:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-12 - Found stream ordering 1 month ago: it's 2 +2020-05-02 09:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-12 - Searching for stream ordering 1 day ago +2020-05-02 09:31:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-12 - Found stream ordering 1 day ago: it's 2 +2020-05-02 09:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-25 - Calling _generate_user_daily_visits +2020-05-02 09:32:12,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-26 - Calling _generate_user_daily_visits +2020-05-02 09:38:07,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-13 - Searching for stream ordering 1 month ago +2020-05-02 09:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-13 - Found stream ordering 1 month ago: it's 2 +2020-05-02 09:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-13 - Searching for stream ordering 1 day ago +2020-05-02 09:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-13 - Found stream ordering 1 day ago: it's 2 +2020-05-02 09:41:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-27 - Calling _generate_user_daily_visits +2020-05-02 09:43:57,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-28 - Calling _generate_user_daily_visits +2020-05-02 09:49:42,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-4 - Rotating notifications +2020-05-02 09:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-14 - Searching for stream ordering 1 month ago +2020-05-02 09:51:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-14 - Found stream ordering 1 month ago: it's 2 +2020-05-02 09:51:12,328 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-14 - Searching for stream ordering 1 day ago +2020-05-02 09:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-14 - Found stream ordering 1 day ago: it's 2 +2020-05-02 09:51:12,331 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-4 - Rotating notifications up to: 2 +2020-05-02 09:51:12,332 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-4 - Rotating notifications, handling 0 rows +2020-05-02 09:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-4 - Rotating notifications, deleted 0 push actions +2020-05-02 09:51:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-29 - Calling _generate_user_daily_visits +2020-05-02 09:55:27,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 09:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-30 - Calling _generate_user_daily_visits +2020-05-02 10:01:12,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-15 - Searching for stream ordering 1 month ago +2020-05-02 10:01:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-15 - Found stream ordering 1 month ago: it's 2 +2020-05-02 10:01:12,328 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-15 - Searching for stream ordering 1 day ago +2020-05-02 10:01:12,329 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-15 - Found stream ordering 1 day ago: it's 2 +2020-05-02 10:01:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-31 - Calling _generate_user_daily_visits +2020-05-02 10:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-32 - Calling _generate_user_daily_visits +2020-05-02 10:06:57,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:11:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-16 - Searching for stream ordering 1 month ago +2020-05-02 10:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-16 - Found stream ordering 1 month ago: it's 2 +2020-05-02 10:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-16 - Searching for stream ordering 1 day ago +2020-05-02 10:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-16 - Found stream ordering 1 day ago: it's 2 +2020-05-02 10:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-33 - Calling _generate_user_daily_visits +2020-05-02 10:12:52,319 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:12:52,354 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 10:16:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-34 - Calling _generate_user_daily_visits +2020-05-02 10:17:37,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:21:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-5 - Rotating notifications +2020-05-02 10:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-17 - Searching for stream ordering 1 month ago +2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-17 - Found stream ordering 1 month ago: it's 2 +2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-17 - Searching for stream ordering 1 day ago +2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-17 - Found stream ordering 1 day ago: it's 2 +2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-5 - Rotating notifications up to: 2 +2020-05-02 10:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-5 - Rotating notifications, handling 0 rows +2020-05-02 10:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-5 - Rotating notifications, deleted 0 push actions +2020-05-02 10:21:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-35 - Calling _generate_user_daily_visits +2020-05-02 10:23:12,321 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-36 - Calling _generate_user_daily_visits +2020-05-02 10:29:07,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:31:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-18 - Searching for stream ordering 1 month ago +2020-05-02 10:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-18 - Found stream ordering 1 month ago: it's 2 +2020-05-02 10:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-18 - Searching for stream ordering 1 day ago +2020-05-02 10:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-18 - Found stream ordering 1 day ago: it's 2 +2020-05-02 10:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-37 - Calling _generate_user_daily_visits +2020-05-02 10:35:02,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-38 - Calling _generate_user_daily_visits +2020-05-02 10:40:47,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:41:12,323 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-19 - Searching for stream ordering 1 month ago +2020-05-02 10:41:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-19 - Found stream ordering 1 month ago: it's 2 +2020-05-02 10:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-19 - Searching for stream ordering 1 day ago +2020-05-02 10:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-19 - Found stream ordering 1 day ago: it's 2 +2020-05-02 10:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-39 - Calling _generate_user_daily_visits +2020-05-02 10:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-40 - Calling _generate_user_daily_visits +2020-05-02 10:46:37,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-6 - Rotating notifications +2020-05-02 10:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-20 - Searching for stream ordering 1 month ago +2020-05-02 10:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-20 - Found stream ordering 1 month ago: it's 2 +2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-20 - Searching for stream ordering 1 day ago +2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-20 - Found stream ordering 1 day ago: it's 2 +2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-6 - Rotating notifications up to: 2 +2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-6 - Rotating notifications, handling 0 rows +2020-05-02 10:51:12,327 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-6 - Rotating notifications, deleted 0 push actions +2020-05-02 10:51:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-41 - Calling _generate_user_daily_visits +2020-05-02 10:52:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 10:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-42 - Calling _generate_user_daily_visits +2020-05-02 10:58:17,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-21 - Searching for stream ordering 1 month ago +2020-05-02 11:01:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-21 - Found stream ordering 1 month ago: it's 2 +2020-05-02 11:01:12,336 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-21 - Searching for stream ordering 1 day ago +2020-05-02 11:01:12,337 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-21 - Found stream ordering 1 day ago: it's 2 +2020-05-02 11:01:12,342 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-43 - Calling _generate_user_daily_visits +2020-05-02 11:04:12,361 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-44 - Calling _generate_user_daily_visits +2020-05-02 11:10:02,324 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-22 - Searching for stream ordering 1 month ago +2020-05-02 11:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-22 - Found stream ordering 1 month ago: it's 2 +2020-05-02 11:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-22 - Searching for stream ordering 1 day ago +2020-05-02 11:11:12,322 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-22 - Found stream ordering 1 day ago: it's 2 +2020-05-02 11:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-45 - Calling _generate_user_daily_visits +2020-05-02 11:15:57,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:15:57,326 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 11:16:12,337 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-46 - Calling _generate_user_daily_visits +2020-05-02 11:20:47,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:21:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-7 - Rotating notifications +2020-05-02 11:21:12,328 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-23 - Searching for stream ordering 1 month ago +2020-05-02 11:21:12,330 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-23 - Found stream ordering 1 month ago: it's 2 +2020-05-02 11:21:12,331 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-23 - Searching for stream ordering 1 day ago +2020-05-02 11:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-23 - Found stream ordering 1 day ago: it's 2 +2020-05-02 11:21:12,334 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-7 - Rotating notifications up to: 2 +2020-05-02 11:21:12,337 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-7 - Rotating notifications, handling 0 rows +2020-05-02 11:21:12,340 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-7 - Rotating notifications, deleted 0 push actions +2020-05-02 11:21:12,352 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-47 - Calling _generate_user_daily_visits +2020-05-02 11:26:12,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-48 - Calling _generate_user_daily_visits +2020-05-02 11:31:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-24 - Searching for stream ordering 1 month ago +2020-05-02 11:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-24 - Found stream ordering 1 month ago: it's 2 +2020-05-02 11:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-24 - Searching for stream ordering 1 day ago +2020-05-02 11:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-24 - Found stream ordering 1 day ago: it's 2 +2020-05-02 11:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-49 - Calling _generate_user_daily_visits +2020-05-02 11:31:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-50 - Calling _generate_user_daily_visits +2020-05-02 11:37:47,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:41:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-25 - Searching for stream ordering 1 month ago +2020-05-02 11:41:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-25 - Found stream ordering 1 month ago: it's 2 +2020-05-02 11:41:12,328 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-25 - Searching for stream ordering 1 day ago +2020-05-02 11:41:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-25 - Found stream ordering 1 day ago: it's 2 +2020-05-02 11:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-51 - Calling _generate_user_daily_visits +2020-05-02 11:43:47,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-52 - Calling _generate_user_daily_visits +2020-05-02 11:49:42,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:51:12,319 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-8 - Rotating notifications +2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-26 - Searching for stream ordering 1 month ago +2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-26 - Found stream ordering 1 month ago: it's 2 +2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-26 - Searching for stream ordering 1 day ago +2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-26 - Found stream ordering 1 day ago: it's 2 +2020-05-02 11:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-8 - Rotating notifications up to: 2 +2020-05-02 11:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-8 - Rotating notifications, handling 0 rows +2020-05-02 11:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-8 - Rotating notifications, deleted 0 push actions +2020-05-02 11:51:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-53 - Calling _generate_user_daily_visits +2020-05-02 11:55:22,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 11:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-54 - Calling _generate_user_daily_visits +2020-05-02 12:01:12,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-27 - Searching for stream ordering 1 month ago +2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-27 - Found stream ordering 1 month ago: it's 2 +2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-27 - Searching for stream ordering 1 day ago +2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-27 - Found stream ordering 1 day ago: it's 2 +2020-05-02 12:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-55 - Calling _generate_user_daily_visits +2020-05-02 12:06:12,337 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-56 - Calling _generate_user_daily_visits +2020-05-02 12:07:02,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:11:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-28 - Searching for stream ordering 1 month ago +2020-05-02 12:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-28 - Found stream ordering 1 month ago: it's 2 +2020-05-02 12:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-28 - Searching for stream ordering 1 day ago +2020-05-02 12:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-28 - Found stream ordering 1 day ago: it's 2 +2020-05-02 12:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-57 - Calling _generate_user_daily_visits +2020-05-02 12:12:57,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-58 - Calling _generate_user_daily_visits +2020-05-02 12:18:57,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:18:57,324 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 12:21:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-9 - Rotating notifications +2020-05-02 12:21:12,330 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-29 - Searching for stream ordering 1 month ago +2020-05-02 12:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-29 - Found stream ordering 1 month ago: it's 2 +2020-05-02 12:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-29 - Searching for stream ordering 1 day ago +2020-05-02 12:21:12,333 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-29 - Found stream ordering 1 day ago: it's 2 +2020-05-02 12:21:12,337 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-9 - Rotating notifications up to: 2 +2020-05-02 12:21:12,339 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-9 - Rotating notifications, handling 0 rows +2020-05-02 12:21:12,341 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-9 - Rotating notifications, deleted 0 push actions +2020-05-02 12:21:12,350 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-59 - Calling _generate_user_daily_visits +2020-05-02 12:23:22,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-60 - Calling _generate_user_daily_visits +2020-05-02 12:29:17,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:31:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-30 - Searching for stream ordering 1 month ago +2020-05-02 12:31:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-30 - Found stream ordering 1 month ago: it's 2 +2020-05-02 12:31:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-30 - Searching for stream ordering 1 day ago +2020-05-02 12:31:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-30 - Found stream ordering 1 day ago: it's 2 +2020-05-02 12:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-61 - Calling _generate_user_daily_visits +2020-05-02 12:35:12,361 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-62 - Calling _generate_user_daily_visits +2020-05-02 12:41:12,324 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-31 - Searching for stream ordering 1 month ago +2020-05-02 12:41:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-31 - Found stream ordering 1 month ago: it's 2 +2020-05-02 12:41:12,329 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-31 - Searching for stream ordering 1 day ago +2020-05-02 12:41:12,329 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-31 - Found stream ordering 1 day ago: it's 2 +2020-05-02 12:41:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-63 - Calling _generate_user_daily_visits +2020-05-02 12:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-64 - Calling _generate_user_daily_visits +2020-05-02 12:46:52,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:51:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-10 - Rotating notifications +2020-05-02 12:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-32 - Searching for stream ordering 1 month ago +2020-05-02 12:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-32 - Found stream ordering 1 month ago: it's 2 +2020-05-02 12:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-32 - Searching for stream ordering 1 day ago +2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-32 - Found stream ordering 1 day ago: it's 2 +2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-10 - Rotating notifications up to: 2 +2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-10 - Rotating notifications, handling 0 rows +2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-10 - Rotating notifications, deleted 0 push actions +2020-05-02 12:51:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-65 - Calling _generate_user_daily_visits +2020-05-02 12:52:37,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 12:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-66 - Calling _generate_user_daily_visits +2020-05-02 12:58:32,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:01:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-33 - Searching for stream ordering 1 month ago +2020-05-02 13:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-33 - Found stream ordering 1 month ago: it's 2 +2020-05-02 13:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-33 - Searching for stream ordering 1 day ago +2020-05-02 13:01:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-33 - Found stream ordering 1 day ago: it's 2 +2020-05-02 13:01:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-67 - Calling _generate_user_daily_visits +2020-05-02 13:04:27,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:06:12,337 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-68 - Calling _generate_user_daily_visits +2020-05-02 13:10:22,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:11:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-34 - Searching for stream ordering 1 month ago +2020-05-02 13:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-34 - Found stream ordering 1 month ago: it's 2 +2020-05-02 13:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-34 - Searching for stream ordering 1 day ago +2020-05-02 13:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-34 - Found stream ordering 1 day ago: it's 2 +2020-05-02 13:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-69 - Calling _generate_user_daily_visits +2020-05-02 13:16:12,324 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-70 - Calling _generate_user_daily_visits +2020-05-02 13:21:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-11 - Rotating notifications +2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-35 - Searching for stream ordering 1 month ago +2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-35 - Found stream ordering 1 month ago: it's 2 +2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-35 - Searching for stream ordering 1 day ago +2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-35 - Found stream ordering 1 day ago: it's 2 +2020-05-02 13:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-11 - Rotating notifications up to: 2 +2020-05-02 13:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-11 - Rotating notifications, handling 0 rows +2020-05-02 13:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-11 - Rotating notifications, deleted 0 push actions +2020-05-02 13:21:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-71 - Calling _generate_user_daily_visits +2020-05-02 13:21:32,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:21:32,325 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 13:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-72 - Calling _generate_user_daily_visits +2020-05-02 13:26:12,339 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:31:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-36 - Searching for stream ordering 1 month ago +2020-05-02 13:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-36 - Found stream ordering 1 month ago: it's 2 +2020-05-02 13:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-36 - Searching for stream ordering 1 day ago +2020-05-02 13:31:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-36 - Found stream ordering 1 day ago: it's 2 +2020-05-02 13:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-73 - Calling _generate_user_daily_visits +2020-05-02 13:31:52,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-74 - Calling _generate_user_daily_visits +2020-05-02 13:37:42,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:41:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-37 - Searching for stream ordering 1 month ago +2020-05-02 13:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-37 - Found stream ordering 1 month ago: it's 2 +2020-05-02 13:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-37 - Searching for stream ordering 1 day ago +2020-05-02 13:41:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-37 - Found stream ordering 1 day ago: it's 2 +2020-05-02 13:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-75 - Calling _generate_user_daily_visits +2020-05-02 13:43:37,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-76 - Calling _generate_user_daily_visits +2020-05-02 13:49:32,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-12 - Rotating notifications +2020-05-02 13:51:12,327 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-38 - Searching for stream ordering 1 month ago +2020-05-02 13:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-38 - Found stream ordering 1 month ago: it's 2 +2020-05-02 13:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-38 - Searching for stream ordering 1 day ago +2020-05-02 13:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-38 - Found stream ordering 1 day ago: it's 2 +2020-05-02 13:51:12,332 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-12 - Rotating notifications up to: 2 +2020-05-02 13:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-12 - Rotating notifications, handling 0 rows +2020-05-02 13:51:12,334 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-12 - Rotating notifications, deleted 0 push actions +2020-05-02 13:51:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-77 - Calling _generate_user_daily_visits +2020-05-02 13:55:22,321 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 13:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-78 - Calling _generate_user_daily_visits +2020-05-02 14:01:12,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 14:01:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-39 - Searching for stream ordering 1 month ago +2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-39 - Found stream ordering 1 month ago: it's 2 +2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-39 - Searching for stream ordering 1 day ago +2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-39 - Found stream ordering 1 day ago: it's 2 +2020-05-02 14:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-79 - Calling _generate_user_daily_visits diff --git a/testdata/matrix-sandbox/synapse-test-log.yaml b/testdata/matrix-sandbox/synapse-test-log.yaml new file mode 100644 index 0000000..91633e4 --- /dev/null +++ b/testdata/matrix-sandbox/synapse-test-log.yaml @@ -0,0 +1,43 @@ +# Log configuration for Synapse. +# +# This is a YAML file containing a standard Python logging configuration +# dictionary. See [1] for details on the valid settings. +# +# [1]: https://docs.python.org/3.7/library/logging.config.html#configuration-dictionary-schema + +version: 1 + +formatters: + precise: + format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s' + +filters: + context: + (): synapse.logging.context.LoggingContextFilter + request: "" + +handlers: + file: + class: logging.handlers.RotatingFileHandler + formatter: precise + filename: /home/bel/Go/src/local/containers/secret-hitler-via-matrix/testdata/matrix-sandbox/homeserver.log + maxBytes: 104857600 + backupCount: 10 + filters: [context] + encoding: utf8 + console: + class: logging.StreamHandler + formatter: precise + filters: [context] + +loggers: + synapse.storage.SQL: + # beware: increasing this to DEBUG will make synapse log sensitive + # information such as access tokens. + level: INFO + +root: + level: INFO + handlers: [file, console] + +disable_existing_loggers: false diff --git a/testdata/matrix-sandbox/synapse-test.key b/testdata/matrix-sandbox/synapse-test.key new file mode 100644 index 0000000..72bb5ae --- /dev/null +++ b/testdata/matrix-sandbox/synapse-test.key @@ -0,0 +1 @@ +ed25519 a_RcOc CohEFmFuSDY+kHBbY//SMIUZp+hIuyOMEphT2NLEsDc From 74b2c36acf5babc70b4e17f47e726b970286c8f6 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:13:56 -0600 Subject: [PATCH 02/34] about to try channels --- secert-hitler/Cargo.lock | 40 +++++++++++++++++++ secert-hitler/Cargo.toml | 1 + .../src/controller/state/mockroom.rs | 7 ++++ testdata/matrix-sandbox/homeserver.log | 8 ++++ 4 files changed, 56 insertions(+) diff --git a/secert-hitler/Cargo.lock b/secert-hitler/Cargo.lock index 440f6fb..6d19f0b 100644 --- a/secert-hitler/Cargo.lock +++ b/secert-hitler/Cargo.lock @@ -1,11 +1,38 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "crossbeam-channel" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" +dependencies = [ + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + [[package]] name = "getrandom" version = "0.1.14" @@ -17,12 +44,24 @@ dependencies = [ "wasi", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "ppv-lite86" version = "0.2.6" @@ -74,6 +113,7 @@ dependencies = [ name = "secert-hitler" version = "0.1.0" dependencies = [ + "crossbeam-channel", "rand", ] diff --git a/secert-hitler/Cargo.toml b/secert-hitler/Cargo.toml index de858f8..bb12c43 100644 --- a/secert-hitler/Cargo.toml +++ b/secert-hitler/Cargo.toml @@ -8,3 +8,4 @@ edition = "2018" [dependencies] rand = "*" +crossbeam-channel = "*" diff --git a/secert-hitler/src/controller/state/mockroom.rs b/secert-hitler/src/controller/state/mockroom.rs index 36d01ee..cd57dc5 100644 --- a/secert-hitler/src/controller/state/mockroom.rs +++ b/secert-hitler/src/controller/state/mockroom.rs @@ -3,6 +3,7 @@ use super::event::Event; use rand::{self, Rng}; use rand::distributions::Alphanumeric; +use crossbeam_channel::{unbounded, Receiver, Sender}; #[derive(Clone, Debug)] pub struct MockRoom { @@ -60,6 +61,12 @@ impl Room for MockRoom { } } +impl Drop for MockRoom { + fn drop(&mut self) { + println!("not impl"); + } +} + pub fn rands() -> String { rand::thread_rng() .sample_iter(&Alphanumeric) diff --git a/testdata/matrix-sandbox/homeserver.log b/testdata/matrix-sandbox/homeserver.log index 829897a..57065af 100644 --- a/testdata/matrix-sandbox/homeserver.log +++ b/testdata/matrix-sandbox/homeserver.log @@ -549,3 +549,11 @@ 2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-39 - Searching for stream ordering 1 day ago 2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-39 - Found stream ordering 1 day ago: it's 2 2020-05-02 14:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-79 - Calling _generate_user_daily_visits +2020-05-02 14:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-80 - Calling _generate_user_daily_visits +2020-05-02 14:06:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 14:11:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-40 - Searching for stream ordering 1 month ago +2020-05-02 14:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-40 - Found stream ordering 1 month ago: it's 2 +2020-05-02 14:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-40 - Searching for stream ordering 1 day ago +2020-05-02 14:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-40 - Found stream ordering 1 day ago: it's 2 +2020-05-02 14:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-81 - Calling _generate_user_daily_visits +2020-05-02 14:12:42,319 - synapse.metrics - 464 - INFO - - Collecting gc 1 From ab88ba7fc0d11419677d51732eb4c3db4c4a4ab7 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:35:38 -0600 Subject: [PATCH 03/34] mock rooms can be joined and have dedicated state of feed --- .../src/controller/state/mockroom.rs | 25 +++++++++----- .../src/controller/state/mockrooms.rs | 34 +++++++++++++++++++ testdata/matrix-sandbox/homeserver.log | 21 ++++++++++++ 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/secert-hitler/src/controller/state/mockroom.rs b/secert-hitler/src/controller/state/mockroom.rs index cd57dc5..82f08fa 100644 --- a/secert-hitler/src/controller/state/mockroom.rs +++ b/secert-hitler/src/controller/state/mockroom.rs @@ -3,13 +3,14 @@ use super::event::Event; use rand::{self, Rng}; use rand::distributions::Alphanumeric; -use crossbeam_channel::{unbounded, Receiver, Sender}; +use crossbeam_channel::{unbounded, Sender, Receiver}; #[derive(Clone, Debug)] pub struct MockRoom { last: String, room_id: String, - events: Vec, + events_s: Sender>, + events_r: Receiver>, } impl MockRoom { @@ -18,10 +19,13 @@ impl MockRoom { } pub fn join(room_id: String) -> MockRoom { + let (s, r) = unbounded(); + s.send(vec![]).ok().unwrap(); MockRoom { last: "".to_string(), room_id: room_id, - events: vec![], + events_s: s, + events_r: r, } } @@ -34,7 +38,8 @@ impl Room for MockRoom { fn sync(&mut self) -> Vec { let mut unseen: Vec = vec![]; let mut last = self.last.clone(); - for e in &self.events { + let events = self.events_r.recv().ok().unwrap(); + for e in &events { if e.next == self.last { unseen.clear(); } else { @@ -42,6 +47,7 @@ impl Room for MockRoom { last = e.next.clone(); } } + self.events_s.send(events).ok().unwrap(); self.last = last; return unseen; } @@ -52,7 +58,9 @@ impl Room for MockRoom { next: rands(), body: message, }; - self.events.push(e); + let mut events = self.events_r.recv().ok().unwrap(); + events.push(e); + self.events_s.send(events).ok().unwrap(); Ok("ok") } @@ -63,7 +71,7 @@ impl Room for MockRoom { impl Drop for MockRoom { fn drop(&mut self) { - println!("not impl"); + println!("MockRoom::drop not impl"); } } @@ -84,14 +92,15 @@ mod tests { fn _dummy() -> MockRoom { let mut r = MockRoom::create(); r.last = "1".to_string(); - r.events = vec![]; + let mut events = r.events_r.recv().ok().unwrap(); for i in 0..5 { - r.events.push(Event{ + events.push(Event{ sender: i.to_string(), next: i.to_string(), body: i.to_string(), }); } + r.events_s.send(events).ok().unwrap(); r } diff --git a/secert-hitler/src/controller/state/mockrooms.rs b/secert-hitler/src/controller/state/mockrooms.rs index 963aa5f..9b1f042 100644 --- a/secert-hitler/src/controller/state/mockrooms.rs +++ b/secert-hitler/src/controller/state/mockrooms.rs @@ -86,4 +86,38 @@ mod tests { assert!(r.is_ok()); assert!(r.ok().unwrap().room_id() == "0"); } + + #[test] + fn join_clobber() { + let mrs = _dummy(); + let mut a = mrs.join("0".to_string()).ok().unwrap(); + let mut b = mrs.join("0".to_string()).ok().unwrap(); + assert!(a.room_id() == b.room_id()); + assert!(a.sync().len() == b.sync().len()); + assert!(a.sync().len() == b.sync().len()); + assert!(a.sync().len() == 0); + assert!(b.sync().len() == 0); + assert!(a.send("from a".to_string()).is_ok()); + assert!(a.sync().len() == 1); + assert!(b.sync().len() == 1); + assert!(b.send("from b".to_string()).is_ok()); + assert!(b.send("from b".to_string()).is_ok()); + assert!(a.sync().len() == 2); + assert!(b.sync().len() == 2); + assert!(a.send("from a".to_string()).is_ok()); + assert!(b.send("from b".to_string()).is_ok()); + assert!(a.send("from a".to_string()).is_ok()); + assert!(a.sync().len() == 3); + assert!(b.sync().len() == 3); + assert!(a.send("from a".to_string()).is_ok()); + assert!(b.send("from b".to_string()).is_ok()); + let a = a.sync(); + let b = b.sync(); + assert!(a.len() == 2); + assert!(b.len() == 2); + assert!(a[0].body == "from a"); + assert!(b[0].body == "from a"); + assert!(a[1].body == "from b"); + assert!(b[1].body == "from b"); + } } diff --git a/testdata/matrix-sandbox/homeserver.log b/testdata/matrix-sandbox/homeserver.log index 57065af..08e891c 100644 --- a/testdata/matrix-sandbox/homeserver.log +++ b/testdata/matrix-sandbox/homeserver.log @@ -557,3 +557,24 @@ 2020-05-02 14:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-40 - Found stream ordering 1 day ago: it's 2 2020-05-02 14:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-81 - Calling _generate_user_daily_visits 2020-05-02 14:12:42,319 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 14:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-82 - Calling _generate_user_daily_visits +2020-05-02 14:18:37,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 14:21:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-13 - Rotating notifications +2020-05-02 14:21:12,329 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-41 - Searching for stream ordering 1 month ago +2020-05-02 14:21:12,331 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-41 - Found stream ordering 1 month ago: it's 2 +2020-05-02 14:21:12,331 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-41 - Searching for stream ordering 1 day ago +2020-05-02 14:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-41 - Found stream ordering 1 day ago: it's 2 +2020-05-02 14:21:12,334 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-13 - Rotating notifications up to: 2 +2020-05-02 14:21:12,336 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-13 - Rotating notifications, handling 0 rows +2020-05-02 14:21:12,337 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-13 - Rotating notifications, deleted 0 push actions +2020-05-02 14:21:12,351 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-83 - Calling _generate_user_daily_visits +2020-05-02 14:24:02,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 14:24:02,326 - synapse.metrics - 464 - INFO - - Collecting gc 2 +2020-05-02 14:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-84 - Calling _generate_user_daily_visits +2020-05-02 14:28:42,321 - synapse.metrics - 464 - INFO - - Collecting gc 1 +2020-05-02 14:31:12,323 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-42 - Searching for stream ordering 1 month ago +2020-05-02 14:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-42 - Found stream ordering 1 month ago: it's 2 +2020-05-02 14:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-42 - Searching for stream ordering 1 day ago +2020-05-02 14:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-42 - Found stream ordering 1 day ago: it's 2 +2020-05-02 14:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-85 - Calling _generate_user_daily_visits +2020-05-02 14:34:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 From d17898fafb0a3a9e74802101480ef6395a6f6652 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:44:44 -0600 Subject: [PATCH 04/34] unittest and more gitignore but for log --- .gitignore | 1 + secert-hitler/src/controller/state/room.rs | 10 +- secert-hitler/src/controller/state/rooms.rs | 10 +- testdata/matrix-sandbox/homeserver.log | 580 -------------------- 4 files changed, 19 insertions(+), 582 deletions(-) delete mode 100644 testdata/matrix-sandbox/homeserver.log diff --git a/.gitignore b/.gitignore index efd4a88..d8dcf48 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/*.sw* **/*.db **/target +**/*.log diff --git a/secert-hitler/src/controller/state/room.rs b/secert-hitler/src/controller/state/room.rs index 8d7b354..9102d5f 100644 --- a/secert-hitler/src/controller/state/room.rs +++ b/secert-hitler/src/controller/state/room.rs @@ -8,7 +8,15 @@ pub trait Room { #[cfg(test)] mod tests { + use super::Room; + use super::super::mockroom::MockRoom; + #[test] - fn room() { + fn mockroom() { + fn gen() -> impl Room { + let r = MockRoom::create(); + r + } + gen(); } } diff --git a/secert-hitler/src/controller/state/rooms.rs b/secert-hitler/src/controller/state/rooms.rs index f417088..77a89ba 100644 --- a/secert-hitler/src/controller/state/rooms.rs +++ b/secert-hitler/src/controller/state/rooms.rs @@ -7,7 +7,15 @@ pub trait Rooms { #[cfg(test)] mod tests { + use super::Rooms; + use super::super::mockrooms::MockRooms; + #[test] - fn rooms() { + fn mockrooms() { + fn gen() -> impl Rooms { + let r = MockRooms::new(); + r + } + gen(); } } diff --git a/testdata/matrix-sandbox/homeserver.log b/testdata/matrix-sandbox/homeserver.log deleted file mode 100644 index 08e891c..0000000 --- a/testdata/matrix-sandbox/homeserver.log +++ /dev/null @@ -1,580 +0,0 @@ -2020-05-02 07:19:16,961 - twisted - 192 - INFO - None - Redirected stdout/stderr to logs -2020-05-02 07:19:16,961 - root - 257 - WARNING - None - ***** STARTING SERVER ***** -2020-05-02 07:19:16,961 - root - 258 - WARNING - None - Server /nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/bin/homeserver version 1.12.1 -2020-05-02 07:19:16,961 - root - 259 - INFO - None - Server hostname: 192.168.0.86 -2020-05-02 07:19:16,961 - synapse.app.homeserver - 346 - INFO - None - Setting up server -2020-05-02 07:19:16,961 - synapse.server - 240 - INFO - None - Setting up. -2020-05-02 07:19:16,962 - synapse.storage.data_stores - 48 - INFO - None - Preparing database 'master'... -2020-05-02 07:19:21,541 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v55 -2020-05-02 07:19:21,542 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 55/access_token_expiry.sql -2020-05-02 07:19:21,548 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 55/track_threepid_validations.sql -2020-05-02 07:19:21,551 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 55/users_alter_deactivated.sql -2020-05-02 07:19:21,556 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v56 -2020-05-02 07:19:21,559 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/add_spans_to_device_lists.sql -2020-05-02 07:19:21,564 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/current_state_events_membership.sql -2020-05-02 07:19:21,570 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/current_state_events_membership_mk2.sql -2020-05-02 07:19:21,571 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/delete_keys_from_deleted_backups.sql -2020-05-02 07:19:21,572 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/destinations_failure_ts.sql -2020-05-02 07:19:21,577 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/device_stream_id_insert.sql -2020-05-02 07:19:21,578 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/devices_last_seen.sql -2020-05-02 07:19:21,584 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/drop_unused_event_tables.sql -2020-05-02 07:19:21,585 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/event_expiry.sql -2020-05-02 07:19:21,586 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/event_labels.sql -2020-05-02 07:19:21,587 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/event_labels_background_update.sql -2020-05-02 07:19:21,587 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/fix_room_keys_index.sql -2020-05-02 07:19:21,588 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/hidden_devices.sql -2020-05-02 07:19:21,589 - synapse.storage.prepare_database - 404 - INFO - None - Applying engine-specific schema 56/hidden_devices_fix.sql.sqlite -2020-05-02 07:19:21,596 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/nuke_empty_communities_from_db.sql -2020-05-02 07:19:21,597 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/public_room_list_idx.sql -2020-05-02 07:19:21,597 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/redaction_censor.sql -2020-05-02 07:19:21,598 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/redaction_censor2.sql -2020-05-02 07:19:21,600 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/redaction_censor4.sql -2020-05-02 07:19:21,600 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/remove_tombstoned_rooms_from_directory.sql -2020-05-02 07:19:21,600 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/room_key_etag.sql -2020-05-02 07:19:21,602 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/room_membership_idx.sql -2020-05-02 07:19:21,603 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/room_retention.sql -2020-05-02 07:19:21,603 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/signing_keys.sql -2020-05-02 07:19:21,604 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/signing_keys_nonunique_signatures.sql -2020-05-02 07:19:21,604 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/state_group_room_idx.sql -2020-05-02 07:19:21,605 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/stats_separated.sql -2020-05-02 07:19:21,607 - synapse.storage.prepare_database - 389 - INFO - None - Running script 56/unique_user_filter_index.py -2020-05-02 07:19:21,704 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/user_external_ids.sql -2020-05-02 07:19:21,706 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 56/users_in_public_rooms_idx.sql -2020-05-02 07:19:21,707 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v57 -2020-05-02 07:19:21,708 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 57/delete_old_current_state_events.sql -2020-05-02 07:19:21,709 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 57/device_list_remote_cache_stale.sql -2020-05-02 07:19:21,711 - synapse.storage.prepare_database - 389 - INFO - None - Running script 57/local_current_membership.py -2020-05-02 07:19:21,713 - synapse.storage.prepare_database - 400 - INFO - None - Applying schema 57/rooms_version_column.sql -2020-05-02 07:19:21,719 - synapse.storage.prepare_database - 404 - INFO - None - Applying engine-specific schema 57/rooms_version_column_2.sql.sqlite -2020-05-02 07:19:21,720 - synapse.storage.prepare_database - 404 - INFO - None - Applying engine-specific schema 57/rooms_version_column_3.sql.sqlite -2020-05-02 07:19:21,744 - synapse.storage.data_stores - 58 - INFO - None - Starting 'main' data store -2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - None - Searching for stream ordering 1 month ago -2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - None - Found stream ordering 1 month ago: it's 0 -2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - None - Searching for stream ordering 1 day ago -2020-05-02 07:19:21,750 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - None - Found stream ordering 1 day ago: it's 0 -2020-05-02 07:19:21,754 - synapse.storage.data_stores - 68 - INFO - None - Starting 'state' data store -2020-05-02 07:19:21,755 - synapse.storage.data_stores - 81 - INFO - None - Database 'master' prepared -2020-05-02 07:19:21,756 - synapse.server - 243 - INFO - None - Finished setting up. -2020-05-02 07:19:21,779 - synapse.app.homeserver - 110 - INFO - - Running -2020-05-02 07:19:21,779 - synapse.app.homeserver - 30 - INFO - - Set file limit to: 4096 -2020-05-02 07:19:21,781 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'profile' -2020-05-02 07:19:21,782 - synapse.push.pusher - 42 - INFO - - email enable notifs: False -2020-05-02 07:19:21,785 - synapse.handlers.auth - 89 - INFO - - Extra password_providers: [] -2020-05-02 07:19:21,786 - synapse.push.mailer - 686 - INFO - - loading email templates ['sso_redirect_confirm.html'] from '/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/res/templates' -2020-05-02 07:19:21,788 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.device_list_update' -2020-05-02 07:19:21,788 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'directory' -2020-05-02 07:19:21,798 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.presence' -2020-05-02 07:19:21,798 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.typing' -2020-05-02 07:19:21,800 - synapse.handlers.deactivate_account - 186 - INFO - user_parter_loop-0 - Starting user parter -2020-05-02 07:19:21,801 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.receipt' -2020-05-02 07:19:21,802 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'org.matrix.signing_key_update' -2020-05-02 07:19:21,802 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'client_keys' -2020-05-02 07:19:21,802 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.direct_to_device' -2020-05-02 07:19:21,812 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/api/v1' -2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/r0' -2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/unstable' -2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/v2_alpha' -2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/versions' -2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/.well-known/matrix/client' -2020-05-02 07:19:21,813 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_synapse/admin' -2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching FilePath('/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/static') to path b'/_matrix/static' -2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/r0' -2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/v1' -2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/federation' -2020-05-02 07:19:21,814 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/key/v2' -2020-05-02 07:19:21,814 - twisted - 192 - INFO - - SynapseSite starting on 39487 -2020-05-02 07:19:21,814 - synapse.app.homeserver - 163 - INFO - - Synapse now listening on TCP port 39487 -2020-05-02 07:19:21,840 - synapse.storage.background_updates - 102 - INFO - background_updates-0 - Starting background schema updates -2020-05-02 07:19:21,840 - synapse.handlers.deactivate_account - 196 - INFO - user_parter_loop-0 - User parter finished: stopping -2020-05-02 07:19:21,841 - synapse.push.pusherpool - 268 - INFO - start_pushers-0 - Started pushers -2020-05-02 07:19:22,843 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'users_set_deactivated_flag' -2020-05-02 07:19:22,861 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'users_set_deactivated_flag'. Processed 0 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:23,862 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'current_state_events_membership' -2020-05-02 07:19:23,879 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'current_state_events_membership'. Processed 0 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:24,880 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'devices_last_seen' -2020-05-02 07:19:24,898 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'devices_last_seen'. Processed 0 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:25,899 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'event_store_labels' -2020-05-02 07:19:25,927 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'event_store_labels'. Processed 0 items in 26ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:26,929 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'redactions_received_ts' -2020-05-02 07:19:26,945 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'redactions_received_ts'. Processed 0 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:27,947 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'redactions_have_censored_ts_idx' -2020-05-02 07:19:27,949 - synapse.storage.background_updates - 396 - INFO - background_updates-0 - Adding index redactions_have_censored_ts to redactions -2020-05-02 07:19:27,980 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'redactions_have_censored_ts_idx'. Processed 1 items in 31ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:28,982 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'remove_tombstoned_rooms_from_directory' -2020-05-02 07:19:28,999 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'remove_tombstoned_rooms_from_directory'. Processed 0 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:30,000 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'room_membership_forgotten_idx' -2020-05-02 07:19:30,003 - synapse.storage.background_updates - 396 - INFO - background_updates-0 - Adding index room_memberships_user_room_forgotten to room_memberships -2020-05-02 07:19:30,034 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'room_membership_forgotten_idx'. Processed 1 items in 32ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:31,035 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'insert_room_retention' -2020-05-02 07:19:31,052 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'insert_room_retention'. Processed 100 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:32,054 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'state_groups_room_id_idx' -2020-05-02 07:19:32,057 - synapse.storage.background_updates - 396 - INFO - background_updates-0 - Adding index state_groups_room_id_idx to state_groups -2020-05-02 07:19:32,088 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'state_groups_room_id_idx'. Processed 1 items in 31ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:33,090 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'populate_stats_process_rooms' -2020-05-02 07:19:33,107 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'populate_stats_process_rooms'. Processed 1 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:34,108 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'add_rooms_room_version_column' -2020-05-02 07:19:34,126 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'add_rooms_room_version_column'. Processed 100 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:35,129 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'populate_stats_process_users' -2020-05-02 07:19:35,145 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'populate_stats_process_users'. Processed 1 items in 14ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:36,146 - synapse.storage.background_updates - 211 - INFO - background_updates-0 - Starting update batch on background update 'delete_old_current_state_events' -2020-05-02 07:19:36,164 - synapse.storage.background_updates - 253 - INFO - background_updates-0 - Running background update 'delete_old_current_state_events'. Processed 100 items in 15ms. (total_rate=0/ms, current_rate=0/ms, total_updated=0, batch_size=100) -2020-05-02 07:19:37,167 - synapse.storage.background_updates - 116 - INFO - background_updates-0 - No more background updates to do. Unscheduling background update task. -2020-05-02 07:21:12,311 - twisted - 192 - INFO - None - Redirected stdout/stderr to logs -2020-05-02 07:21:12,311 - root - 257 - WARNING - None - ***** STARTING SERVER ***** -2020-05-02 07:21:12,311 - root - 258 - WARNING - None - Server /nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/bin/homeserver version 1.12.1 -2020-05-02 07:21:12,311 - root - 259 - INFO - None - Server hostname: 192.168.0.86 -2020-05-02 07:21:12,311 - synapse.app.homeserver - 346 - INFO - None - Setting up server -2020-05-02 07:21:12,311 - synapse.server - 240 - INFO - None - Setting up. -2020-05-02 07:21:12,312 - synapse.storage.data_stores - 48 - INFO - None - Preparing database 'master'... -2020-05-02 07:21:12,314 - synapse.storage.prepare_database - 320 - INFO - None - Upgrading schema to v57 -2020-05-02 07:21:12,316 - synapse.storage.data_stores - 58 - INFO - None - Starting 'main' data store -2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - None - Searching for stream ordering 1 month ago -2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - None - Found stream ordering 1 month ago: it's 0 -2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - None - Searching for stream ordering 1 day ago -2020-05-02 07:21:12,318 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - None - Found stream ordering 1 day ago: it's 0 -2020-05-02 07:21:12,320 - synapse.storage.data_stores - 68 - INFO - None - Starting 'state' data store -2020-05-02 07:21:12,320 - synapse.storage.data_stores - 81 - INFO - None - Database 'master' prepared -2020-05-02 07:21:12,320 - synapse.server - 243 - INFO - None - Finished setting up. -2020-05-02 07:21:12,335 - synapse.app.homeserver - 110 - INFO - - Running -2020-05-02 07:21:12,335 - synapse.app.homeserver - 30 - INFO - - Set file limit to: 4096 -2020-05-02 07:21:12,337 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'profile' -2020-05-02 07:21:12,338 - synapse.push.pusher - 42 - INFO - - email enable notifs: False -2020-05-02 07:21:12,341 - synapse.handlers.auth - 89 - INFO - - Extra password_providers: [] -2020-05-02 07:21:12,341 - synapse.push.mailer - 686 - INFO - - loading email templates ['sso_redirect_confirm.html'] from '/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/res/templates' -2020-05-02 07:21:12,344 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.device_list_update' -2020-05-02 07:21:12,344 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'directory' -2020-05-02 07:21:12,352 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.presence' -2020-05-02 07:21:12,352 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.typing' -2020-05-02 07:21:12,354 - synapse.handlers.deactivate_account - 186 - INFO - user_parter_loop-0 - Starting user parter -2020-05-02 07:21:12,355 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.receipt' -2020-05-02 07:21:12,355 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'org.matrix.signing_key_update' -2020-05-02 07:21:12,355 - synapse.federation.federation_server - 766 - INFO - - Registering federation query handler for 'client_keys' -2020-05-02 07:21:12,356 - synapse.federation.federation_server - 748 - INFO - - Registering federation EDU handler for 'm.direct_to_device' -2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/api/v1' -2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/r0' -2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/unstable' -2020-05-02 07:21:12,366 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/v2_alpha' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/client/versions' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/.well-known/matrix/client' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_synapse/admin' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching FilePath('/nix/store/8xrn90w8184gwac56bwm8dgxb2dl0qql-matrix-synapse-1.12.1/lib/python3.7/site-packages/synapse/static') to path b'/_matrix/static' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/r0' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/media/v1' -2020-05-02 07:21:12,367 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/federation' -2020-05-02 07:21:12,368 - synapse.util.httpresourcetree - 46 - INFO - - Attaching to path b'/_matrix/key/v2' -2020-05-02 07:21:12,368 - twisted - 192 - INFO - - SynapseSite starting on 39487 -2020-05-02 07:21:12,368 - synapse.app.homeserver - 163 - INFO - - Synapse now listening on TCP port 39487 -2020-05-02 07:21:12,393 - synapse.storage.background_updates - 102 - INFO - background_updates-0 - Starting background schema updates -2020-05-02 07:21:12,393 - synapse.handlers.deactivate_account - 196 - INFO - user_parter_loop-0 - User parter finished: stopping -2020-05-02 07:21:12,394 - synapse.push.pusherpool - 268 - INFO - start_pushers-0 - Started pushers -2020-05-02 07:21:13,396 - synapse.storage.background_updates - 116 - INFO - background_updates-0 - No more background updates to do. Unscheduling background update task. -2020-05-02 07:22:59,726 - synapse.handlers.auth - 323 - INFO - POST-0 - Auth completed with creds: {'m.login.dummy': True}. Client dict has keys: ['username', 'password'] -2020-05-02 07:22:59,794 - synapse.handlers.auth - 526 - INFO - POST-0 - Logging in user @a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86 on device FNJPXRYPIB -2020-05-02 07:22:59,817 - synapse.access.http.39487 - 302 - INFO - POST-0 - ::1 - 39487 - {None} Processed request: 0.093sec/0.001sec (0.019sec, 0.000sec) (0.007sec/0.060sec/11) 472B 200 "POST /_matrix/client/r0/register HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:00,005 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:23:00,538 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:23:00,715 - synapse.access.http.39487 - 302 - INFO - POST-1 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.835sec/0.000sec (0.091sec, 0.011sec) (0.341sec/0.147sec/40) 126B 200 "POST /_matrix/client/r0/createRoom HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:00,797 - synapse.access.http.39487 - 302 - INFO - POST-2 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.062sec/0.001sec (0.003sec, 0.000sec) (0.040sec/0.013sec/6) 54B 200 "POST /_matrix/client/r0/join/!qXGPZxkFUrZujySLCj:192.168.0.86 HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:00,879 - synapse.access.http.39487 - 302 - INFO - PUT-3 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.048sec/0.001sec (0.009sec, 0.000sec) (0.002sec/0.001sec/2) 67B 200 "PUT /_matrix/client/r0/rooms/!qXGPZxkFUrZujySLCj:192.168.0.86/send/m.room.message/6432825e-924a-4af8-a8ad-00a2323515e4 HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:01,026 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:23:01,035 - synapse.access.http.39487 - 302 - INFO - GET-4 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.122sec/0.000sec (0.022sec, 0.000sec) (0.045sec/0.030sec/19) 21309B 200 "GET /_matrix/client/r0/sync HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:01,077 - synapse.access.http.39487 - 302 - INFO - PUT-5 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.023sec/0.001sec (0.000sec, 0.000sec) (0.001sec/0.000sec/2) 67B 200 "PUT /_matrix/client/r0/rooms/!qXGPZxkFUrZujySLCj:192.168.0.86/send/m.room.message/c3e7de47-3353-493f-87b3-36ee93c925a8 HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:01,127 - synapse.access.http.39487 - 302 - INFO - GET-6 - ::1 - 39487 - {@a1e9066e-d062-4af6-9ee5-e8c069e344ba:192.168.0.86} Processed request: 0.035sec/0.001sec (0.008sec, 0.000sec) (0.022sec/0.001sec/1) 1788B 200 "GET /_matrix/client/r0/sync?since=s8_3_0_1_1_1_1_2_1 HTTP/1.1" "curl/7.58.0" [0 dbevts] -2020-05-02 07:23:12,354 - synapse.handlers.presence - 256 - INFO - persist_presence_changes-0 - Persisting 1 unpersisted presence updates -2020-05-02 07:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-0 - Calling _generate_user_daily_visits -2020-05-02 07:26:42,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:31:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-0 - Searching for stream ordering 1 month ago -2020-05-02 07:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-0 - Found stream ordering 1 month ago: it's 2 -2020-05-02 07:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-0 - Searching for stream ordering 1 day ago -2020-05-02 07:31:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-0 - Found stream ordering 1 day ago: it's 2 -2020-05-02 07:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-1 - Calling _generate_user_daily_visits -2020-05-02 07:32:42,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-2 - Calling _generate_user_daily_visits -2020-05-02 07:38:27,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-1 - Searching for stream ordering 1 month ago -2020-05-02 07:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-1 - Found stream ordering 1 month ago: it's 2 -2020-05-02 07:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-1 - Searching for stream ordering 1 day ago -2020-05-02 07:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-1 - Found stream ordering 1 day ago: it's 2 -2020-05-02 07:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-3 - Calling _generate_user_daily_visits -2020-05-02 07:44:27,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-4 - Calling _generate_user_daily_visits -2020-05-02 07:50:12,360 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-0 - Rotating notifications -2020-05-02 07:51:12,328 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-2 - Searching for stream ordering 1 month ago -2020-05-02 07:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-2 - Found stream ordering 1 month ago: it's 2 -2020-05-02 07:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-2 - Searching for stream ordering 1 day ago -2020-05-02 07:51:12,331 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-2 - Found stream ordering 1 day ago: it's 2 -2020-05-02 07:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-0 - Rotating notifications up to: 2 -2020-05-02 07:51:12,334 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-0 - Rotating notifications, handling 0 rows -2020-05-02 07:51:12,336 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-0 - Rotating notifications, deleted 0 push actions -2020-05-02 07:51:12,355 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-5 - Calling _generate_user_daily_visits -2020-05-02 07:55:47,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 07:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-6 - Calling _generate_user_daily_visits -2020-05-02 08:01:12,323 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-3 - Searching for stream ordering 1 month ago -2020-05-02 08:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-3 - Found stream ordering 1 month ago: it's 2 -2020-05-02 08:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-3 - Searching for stream ordering 1 day ago -2020-05-02 08:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-3 - Found stream ordering 1 day ago: it's 2 -2020-05-02 08:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-7 - Calling _generate_user_daily_visits -2020-05-02 08:01:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-8 - Calling _generate_user_daily_visits -2020-05-02 08:07:12,362 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:07:12,370 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 08:11:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-4 - Searching for stream ordering 1 month ago -2020-05-02 08:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-4 - Found stream ordering 1 month ago: it's 2 -2020-05-02 08:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-4 - Searching for stream ordering 1 day ago -2020-05-02 08:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-4 - Found stream ordering 1 day ago: it's 2 -2020-05-02 08:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-9 - Calling _generate_user_daily_visits -2020-05-02 08:12:02,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:16:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-10 - Calling _generate_user_daily_visits -2020-05-02 08:17:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:21:12,320 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-1 - Rotating notifications -2020-05-02 08:21:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-5 - Searching for stream ordering 1 month ago -2020-05-02 08:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-5 - Found stream ordering 1 month ago: it's 2 -2020-05-02 08:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-5 - Searching for stream ordering 1 day ago -2020-05-02 08:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-5 - Found stream ordering 1 day ago: it's 2 -2020-05-02 08:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-1 - Rotating notifications up to: 2 -2020-05-02 08:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-1 - Rotating notifications, handling 0 rows -2020-05-02 08:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-1 - Rotating notifications, deleted 0 push actions -2020-05-02 08:21:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-11 - Calling _generate_user_daily_visits -2020-05-02 08:23:27,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-12 - Calling _generate_user_daily_visits -2020-05-02 08:29:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:31:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-6 - Searching for stream ordering 1 month ago -2020-05-02 08:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-6 - Found stream ordering 1 month ago: it's 2 -2020-05-02 08:31:12,335 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-6 - Searching for stream ordering 1 day ago -2020-05-02 08:31:12,337 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-6 - Found stream ordering 1 day ago: it's 2 -2020-05-02 08:31:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-13 - Calling _generate_user_daily_visits -2020-05-02 08:35:17,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-14 - Calling _generate_user_daily_visits -2020-05-02 08:41:07,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:41:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-7 - Searching for stream ordering 1 month ago -2020-05-02 08:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-7 - Found stream ordering 1 month ago: it's 2 -2020-05-02 08:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-7 - Searching for stream ordering 1 day ago -2020-05-02 08:41:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-7 - Found stream ordering 1 day ago: it's 2 -2020-05-02 08:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-15 - Calling _generate_user_daily_visits -2020-05-02 08:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-16 - Calling _generate_user_daily_visits -2020-05-02 08:46:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-2 - Rotating notifications -2020-05-02 08:51:12,327 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-8 - Searching for stream ordering 1 month ago -2020-05-02 08:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-8 - Found stream ordering 1 month ago: it's 2 -2020-05-02 08:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-8 - Searching for stream ordering 1 day ago -2020-05-02 08:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-8 - Found stream ordering 1 day ago: it's 2 -2020-05-02 08:51:12,332 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-2 - Rotating notifications up to: 2 -2020-05-02 08:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-2 - Rotating notifications, handling 0 rows -2020-05-02 08:51:12,334 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-2 - Rotating notifications, deleted 0 push actions -2020-05-02 08:51:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-17 - Calling _generate_user_daily_visits -2020-05-02 08:52:42,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 08:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-18 - Calling _generate_user_daily_visits -2020-05-02 08:58:37,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-9 - Searching for stream ordering 1 month ago -2020-05-02 09:01:12,322 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-9 - Found stream ordering 1 month ago: it's 2 -2020-05-02 09:01:12,322 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-9 - Searching for stream ordering 1 day ago -2020-05-02 09:01:12,322 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-9 - Found stream ordering 1 day ago: it's 2 -2020-05-02 09:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-19 - Calling _generate_user_daily_visits -2020-05-02 09:04:17,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-20 - Calling _generate_user_daily_visits -2020-05-02 09:10:12,362 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:10:12,370 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 09:11:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-10 - Searching for stream ordering 1 month ago -2020-05-02 09:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-10 - Found stream ordering 1 month ago: it's 2 -2020-05-02 09:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-10 - Searching for stream ordering 1 day ago -2020-05-02 09:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-10 - Found stream ordering 1 day ago: it's 2 -2020-05-02 09:11:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-21 - Calling _generate_user_daily_visits -2020-05-02 09:15:07,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-22 - Calling _generate_user_daily_visits -2020-05-02 09:20:52,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:21:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-3 - Rotating notifications -2020-05-02 09:21:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-11 - Searching for stream ordering 1 month ago -2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-11 - Found stream ordering 1 month ago: it's 2 -2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-11 - Searching for stream ordering 1 day ago -2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-11 - Found stream ordering 1 day ago: it's 2 -2020-05-02 09:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-3 - Rotating notifications up to: 2 -2020-05-02 09:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-3 - Rotating notifications, handling 0 rows -2020-05-02 09:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-3 - Rotating notifications, deleted 0 push actions -2020-05-02 09:21:12,338 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-23 - Calling _generate_user_daily_visits -2020-05-02 09:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-24 - Calling _generate_user_daily_visits -2020-05-02 09:26:12,362 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:31:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-12 - Searching for stream ordering 1 month ago -2020-05-02 09:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-12 - Found stream ordering 1 month ago: it's 2 -2020-05-02 09:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-12 - Searching for stream ordering 1 day ago -2020-05-02 09:31:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-12 - Found stream ordering 1 day ago: it's 2 -2020-05-02 09:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-25 - Calling _generate_user_daily_visits -2020-05-02 09:32:12,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-26 - Calling _generate_user_daily_visits -2020-05-02 09:38:07,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:41:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-13 - Searching for stream ordering 1 month ago -2020-05-02 09:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-13 - Found stream ordering 1 month ago: it's 2 -2020-05-02 09:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-13 - Searching for stream ordering 1 day ago -2020-05-02 09:41:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-13 - Found stream ordering 1 day ago: it's 2 -2020-05-02 09:41:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-27 - Calling _generate_user_daily_visits -2020-05-02 09:43:57,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-28 - Calling _generate_user_daily_visits -2020-05-02 09:49:42,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-4 - Rotating notifications -2020-05-02 09:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-14 - Searching for stream ordering 1 month ago -2020-05-02 09:51:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-14 - Found stream ordering 1 month ago: it's 2 -2020-05-02 09:51:12,328 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-14 - Searching for stream ordering 1 day ago -2020-05-02 09:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-14 - Found stream ordering 1 day ago: it's 2 -2020-05-02 09:51:12,331 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-4 - Rotating notifications up to: 2 -2020-05-02 09:51:12,332 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-4 - Rotating notifications, handling 0 rows -2020-05-02 09:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-4 - Rotating notifications, deleted 0 push actions -2020-05-02 09:51:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-29 - Calling _generate_user_daily_visits -2020-05-02 09:55:27,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 09:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-30 - Calling _generate_user_daily_visits -2020-05-02 10:01:12,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-15 - Searching for stream ordering 1 month ago -2020-05-02 10:01:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-15 - Found stream ordering 1 month ago: it's 2 -2020-05-02 10:01:12,328 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-15 - Searching for stream ordering 1 day ago -2020-05-02 10:01:12,329 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-15 - Found stream ordering 1 day ago: it's 2 -2020-05-02 10:01:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-31 - Calling _generate_user_daily_visits -2020-05-02 10:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-32 - Calling _generate_user_daily_visits -2020-05-02 10:06:57,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:11:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-16 - Searching for stream ordering 1 month ago -2020-05-02 10:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-16 - Found stream ordering 1 month ago: it's 2 -2020-05-02 10:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-16 - Searching for stream ordering 1 day ago -2020-05-02 10:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-16 - Found stream ordering 1 day ago: it's 2 -2020-05-02 10:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-33 - Calling _generate_user_daily_visits -2020-05-02 10:12:52,319 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:12:52,354 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 10:16:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-34 - Calling _generate_user_daily_visits -2020-05-02 10:17:37,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:21:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-5 - Rotating notifications -2020-05-02 10:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-17 - Searching for stream ordering 1 month ago -2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-17 - Found stream ordering 1 month ago: it's 2 -2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-17 - Searching for stream ordering 1 day ago -2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-17 - Found stream ordering 1 day ago: it's 2 -2020-05-02 10:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-5 - Rotating notifications up to: 2 -2020-05-02 10:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-5 - Rotating notifications, handling 0 rows -2020-05-02 10:21:12,327 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-5 - Rotating notifications, deleted 0 push actions -2020-05-02 10:21:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-35 - Calling _generate_user_daily_visits -2020-05-02 10:23:12,321 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-36 - Calling _generate_user_daily_visits -2020-05-02 10:29:07,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:31:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-18 - Searching for stream ordering 1 month ago -2020-05-02 10:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-18 - Found stream ordering 1 month ago: it's 2 -2020-05-02 10:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-18 - Searching for stream ordering 1 day ago -2020-05-02 10:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-18 - Found stream ordering 1 day ago: it's 2 -2020-05-02 10:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-37 - Calling _generate_user_daily_visits -2020-05-02 10:35:02,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-38 - Calling _generate_user_daily_visits -2020-05-02 10:40:47,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:41:12,323 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-19 - Searching for stream ordering 1 month ago -2020-05-02 10:41:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-19 - Found stream ordering 1 month ago: it's 2 -2020-05-02 10:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-19 - Searching for stream ordering 1 day ago -2020-05-02 10:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-19 - Found stream ordering 1 day ago: it's 2 -2020-05-02 10:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-39 - Calling _generate_user_daily_visits -2020-05-02 10:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-40 - Calling _generate_user_daily_visits -2020-05-02 10:46:37,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-6 - Rotating notifications -2020-05-02 10:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-20 - Searching for stream ordering 1 month ago -2020-05-02 10:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-20 - Found stream ordering 1 month ago: it's 2 -2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-20 - Searching for stream ordering 1 day ago -2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-20 - Found stream ordering 1 day ago: it's 2 -2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-6 - Rotating notifications up to: 2 -2020-05-02 10:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-6 - Rotating notifications, handling 0 rows -2020-05-02 10:51:12,327 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-6 - Rotating notifications, deleted 0 push actions -2020-05-02 10:51:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-41 - Calling _generate_user_daily_visits -2020-05-02 10:52:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 10:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-42 - Calling _generate_user_daily_visits -2020-05-02 10:58:17,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-21 - Searching for stream ordering 1 month ago -2020-05-02 11:01:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-21 - Found stream ordering 1 month ago: it's 2 -2020-05-02 11:01:12,336 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-21 - Searching for stream ordering 1 day ago -2020-05-02 11:01:12,337 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-21 - Found stream ordering 1 day ago: it's 2 -2020-05-02 11:01:12,342 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-43 - Calling _generate_user_daily_visits -2020-05-02 11:04:12,361 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-44 - Calling _generate_user_daily_visits -2020-05-02 11:10:02,324 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-22 - Searching for stream ordering 1 month ago -2020-05-02 11:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-22 - Found stream ordering 1 month ago: it's 2 -2020-05-02 11:11:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-22 - Searching for stream ordering 1 day ago -2020-05-02 11:11:12,322 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-22 - Found stream ordering 1 day ago: it's 2 -2020-05-02 11:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-45 - Calling _generate_user_daily_visits -2020-05-02 11:15:57,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:15:57,326 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 11:16:12,337 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-46 - Calling _generate_user_daily_visits -2020-05-02 11:20:47,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:21:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-7 - Rotating notifications -2020-05-02 11:21:12,328 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-23 - Searching for stream ordering 1 month ago -2020-05-02 11:21:12,330 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-23 - Found stream ordering 1 month ago: it's 2 -2020-05-02 11:21:12,331 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-23 - Searching for stream ordering 1 day ago -2020-05-02 11:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-23 - Found stream ordering 1 day ago: it's 2 -2020-05-02 11:21:12,334 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-7 - Rotating notifications up to: 2 -2020-05-02 11:21:12,337 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-7 - Rotating notifications, handling 0 rows -2020-05-02 11:21:12,340 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-7 - Rotating notifications, deleted 0 push actions -2020-05-02 11:21:12,352 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-47 - Calling _generate_user_daily_visits -2020-05-02 11:26:12,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-48 - Calling _generate_user_daily_visits -2020-05-02 11:31:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-24 - Searching for stream ordering 1 month ago -2020-05-02 11:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-24 - Found stream ordering 1 month ago: it's 2 -2020-05-02 11:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-24 - Searching for stream ordering 1 day ago -2020-05-02 11:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-24 - Found stream ordering 1 day ago: it's 2 -2020-05-02 11:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-49 - Calling _generate_user_daily_visits -2020-05-02 11:31:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-50 - Calling _generate_user_daily_visits -2020-05-02 11:37:47,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:41:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-25 - Searching for stream ordering 1 month ago -2020-05-02 11:41:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-25 - Found stream ordering 1 month ago: it's 2 -2020-05-02 11:41:12,328 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-25 - Searching for stream ordering 1 day ago -2020-05-02 11:41:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-25 - Found stream ordering 1 day ago: it's 2 -2020-05-02 11:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-51 - Calling _generate_user_daily_visits -2020-05-02 11:43:47,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-52 - Calling _generate_user_daily_visits -2020-05-02 11:49:42,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:51:12,319 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-8 - Rotating notifications -2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-26 - Searching for stream ordering 1 month ago -2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-26 - Found stream ordering 1 month ago: it's 2 -2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-26 - Searching for stream ordering 1 day ago -2020-05-02 11:51:12,320 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-26 - Found stream ordering 1 day ago: it's 2 -2020-05-02 11:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-8 - Rotating notifications up to: 2 -2020-05-02 11:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-8 - Rotating notifications, handling 0 rows -2020-05-02 11:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-8 - Rotating notifications, deleted 0 push actions -2020-05-02 11:51:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-53 - Calling _generate_user_daily_visits -2020-05-02 11:55:22,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 11:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-54 - Calling _generate_user_daily_visits -2020-05-02 12:01:12,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-27 - Searching for stream ordering 1 month ago -2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-27 - Found stream ordering 1 month ago: it's 2 -2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-27 - Searching for stream ordering 1 day ago -2020-05-02 12:01:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-27 - Found stream ordering 1 day ago: it's 2 -2020-05-02 12:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-55 - Calling _generate_user_daily_visits -2020-05-02 12:06:12,337 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-56 - Calling _generate_user_daily_visits -2020-05-02 12:07:02,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:11:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-28 - Searching for stream ordering 1 month ago -2020-05-02 12:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-28 - Found stream ordering 1 month ago: it's 2 -2020-05-02 12:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-28 - Searching for stream ordering 1 day ago -2020-05-02 12:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-28 - Found stream ordering 1 day ago: it's 2 -2020-05-02 12:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-57 - Calling _generate_user_daily_visits -2020-05-02 12:12:57,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-58 - Calling _generate_user_daily_visits -2020-05-02 12:18:57,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:18:57,324 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 12:21:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-9 - Rotating notifications -2020-05-02 12:21:12,330 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-29 - Searching for stream ordering 1 month ago -2020-05-02 12:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-29 - Found stream ordering 1 month ago: it's 2 -2020-05-02 12:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-29 - Searching for stream ordering 1 day ago -2020-05-02 12:21:12,333 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-29 - Found stream ordering 1 day ago: it's 2 -2020-05-02 12:21:12,337 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-9 - Rotating notifications up to: 2 -2020-05-02 12:21:12,339 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-9 - Rotating notifications, handling 0 rows -2020-05-02 12:21:12,341 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-9 - Rotating notifications, deleted 0 push actions -2020-05-02 12:21:12,350 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-59 - Calling _generate_user_daily_visits -2020-05-02 12:23:22,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-60 - Calling _generate_user_daily_visits -2020-05-02 12:29:17,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:31:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-30 - Searching for stream ordering 1 month ago -2020-05-02 12:31:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-30 - Found stream ordering 1 month ago: it's 2 -2020-05-02 12:31:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-30 - Searching for stream ordering 1 day ago -2020-05-02 12:31:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-30 - Found stream ordering 1 day ago: it's 2 -2020-05-02 12:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-61 - Calling _generate_user_daily_visits -2020-05-02 12:35:12,361 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-62 - Calling _generate_user_daily_visits -2020-05-02 12:41:12,324 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-31 - Searching for stream ordering 1 month ago -2020-05-02 12:41:12,328 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-31 - Found stream ordering 1 month ago: it's 2 -2020-05-02 12:41:12,329 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-31 - Searching for stream ordering 1 day ago -2020-05-02 12:41:12,329 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-31 - Found stream ordering 1 day ago: it's 2 -2020-05-02 12:41:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-63 - Calling _generate_user_daily_visits -2020-05-02 12:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-64 - Calling _generate_user_daily_visits -2020-05-02 12:46:52,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:51:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-10 - Rotating notifications -2020-05-02 12:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-32 - Searching for stream ordering 1 month ago -2020-05-02 12:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-32 - Found stream ordering 1 month ago: it's 2 -2020-05-02 12:51:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-32 - Searching for stream ordering 1 day ago -2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-32 - Found stream ordering 1 day ago: it's 2 -2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-10 - Rotating notifications up to: 2 -2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-10 - Rotating notifications, handling 0 rows -2020-05-02 12:51:12,326 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-10 - Rotating notifications, deleted 0 push actions -2020-05-02 12:51:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-65 - Calling _generate_user_daily_visits -2020-05-02 12:52:37,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 12:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-66 - Calling _generate_user_daily_visits -2020-05-02 12:58:32,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:01:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-33 - Searching for stream ordering 1 month ago -2020-05-02 13:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-33 - Found stream ordering 1 month ago: it's 2 -2020-05-02 13:01:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-33 - Searching for stream ordering 1 day ago -2020-05-02 13:01:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-33 - Found stream ordering 1 day ago: it's 2 -2020-05-02 13:01:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-67 - Calling _generate_user_daily_visits -2020-05-02 13:04:27,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:06:12,337 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-68 - Calling _generate_user_daily_visits -2020-05-02 13:10:22,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:11:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-34 - Searching for stream ordering 1 month ago -2020-05-02 13:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-34 - Found stream ordering 1 month ago: it's 2 -2020-05-02 13:11:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-34 - Searching for stream ordering 1 day ago -2020-05-02 13:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-34 - Found stream ordering 1 day ago: it's 2 -2020-05-02 13:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-69 - Calling _generate_user_daily_visits -2020-05-02 13:16:12,324 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-70 - Calling _generate_user_daily_visits -2020-05-02 13:21:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-11 - Rotating notifications -2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-35 - Searching for stream ordering 1 month ago -2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-35 - Found stream ordering 1 month ago: it's 2 -2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-35 - Searching for stream ordering 1 day ago -2020-05-02 13:21:12,325 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-35 - Found stream ordering 1 day ago: it's 2 -2020-05-02 13:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-11 - Rotating notifications up to: 2 -2020-05-02 13:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-11 - Rotating notifications, handling 0 rows -2020-05-02 13:21:12,326 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-11 - Rotating notifications, deleted 0 push actions -2020-05-02 13:21:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-71 - Calling _generate_user_daily_visits -2020-05-02 13:21:32,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:21:32,325 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 13:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-72 - Calling _generate_user_daily_visits -2020-05-02 13:26:12,339 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:31:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-36 - Searching for stream ordering 1 month ago -2020-05-02 13:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-36 - Found stream ordering 1 month ago: it's 2 -2020-05-02 13:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-36 - Searching for stream ordering 1 day ago -2020-05-02 13:31:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-36 - Found stream ordering 1 day ago: it's 2 -2020-05-02 13:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-73 - Calling _generate_user_daily_visits -2020-05-02 13:31:52,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:36:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-74 - Calling _generate_user_daily_visits -2020-05-02 13:37:42,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:41:12,324 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-37 - Searching for stream ordering 1 month ago -2020-05-02 13:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-37 - Found stream ordering 1 month ago: it's 2 -2020-05-02 13:41:12,326 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-37 - Searching for stream ordering 1 day ago -2020-05-02 13:41:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-37 - Found stream ordering 1 day ago: it's 2 -2020-05-02 13:41:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-75 - Calling _generate_user_daily_visits -2020-05-02 13:43:37,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:46:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-76 - Calling _generate_user_daily_visits -2020-05-02 13:49:32,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:51:12,321 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-12 - Rotating notifications -2020-05-02 13:51:12,327 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-38 - Searching for stream ordering 1 month ago -2020-05-02 13:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-38 - Found stream ordering 1 month ago: it's 2 -2020-05-02 13:51:12,329 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-38 - Searching for stream ordering 1 day ago -2020-05-02 13:51:12,330 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-38 - Found stream ordering 1 day ago: it's 2 -2020-05-02 13:51:12,332 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-12 - Rotating notifications up to: 2 -2020-05-02 13:51:12,333 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-12 - Rotating notifications, handling 0 rows -2020-05-02 13:51:12,334 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-12 - Rotating notifications, deleted 0 push actions -2020-05-02 13:51:12,341 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-77 - Calling _generate_user_daily_visits -2020-05-02 13:55:22,321 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 13:56:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-78 - Calling _generate_user_daily_visits -2020-05-02 14:01:12,320 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 14:01:12,320 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-39 - Searching for stream ordering 1 month ago -2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-39 - Found stream ordering 1 month ago: it's 2 -2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-39 - Searching for stream ordering 1 day ago -2020-05-02 14:01:12,321 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-39 - Found stream ordering 1 day ago: it's 2 -2020-05-02 14:01:12,335 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-79 - Calling _generate_user_daily_visits -2020-05-02 14:06:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-80 - Calling _generate_user_daily_visits -2020-05-02 14:06:52,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 14:11:12,325 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-40 - Searching for stream ordering 1 month ago -2020-05-02 14:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-40 - Found stream ordering 1 month ago: it's 2 -2020-05-02 14:11:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-40 - Searching for stream ordering 1 day ago -2020-05-02 14:11:12,328 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-40 - Found stream ordering 1 day ago: it's 2 -2020-05-02 14:11:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-81 - Calling _generate_user_daily_visits -2020-05-02 14:12:42,319 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 14:16:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-82 - Calling _generate_user_daily_visits -2020-05-02 14:18:37,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 14:21:12,322 - synapse.storage.data_stores.main.event_push_actions - 834 - INFO - rotate_notifs-13 - Rotating notifications -2020-05-02 14:21:12,329 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-41 - Searching for stream ordering 1 month ago -2020-05-02 14:21:12,331 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-41 - Found stream ordering 1 month ago: it's 2 -2020-05-02 14:21:12,331 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-41 - Searching for stream ordering 1 day ago -2020-05-02 14:21:12,332 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-41 - Found stream ordering 1 day ago: it's 2 -2020-05-02 14:21:12,334 - synapse.storage.data_stores.main.event_push_actions - 878 - INFO - rotate_notifs-13 - Rotating notifications up to: 2 -2020-05-02 14:21:12,336 - synapse.storage.data_stores.main.event_push_actions - 913 - INFO - rotate_notifs-13 - Rotating notifications, handling 0 rows -2020-05-02 14:21:12,337 - synapse.storage.data_stores.main.event_push_actions - 947 - INFO - rotate_notifs-13 - Rotating notifications, deleted 0 push actions -2020-05-02 14:21:12,351 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-83 - Calling _generate_user_daily_visits -2020-05-02 14:24:02,323 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 14:24:02,326 - synapse.metrics - 464 - INFO - - Collecting gc 2 -2020-05-02 14:26:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-84 - Calling _generate_user_daily_visits -2020-05-02 14:28:42,321 - synapse.metrics - 464 - INFO - - Collecting gc 1 -2020-05-02 14:31:12,323 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - event_push_action_stream_orderings-42 - Searching for stream ordering 1 month ago -2020-05-02 14:31:12,326 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - event_push_action_stream_orderings-42 - Found stream ordering 1 month ago: it's 2 -2020-05-02 14:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - event_push_action_stream_orderings-42 - Searching for stream ordering 1 day ago -2020-05-02 14:31:12,327 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - event_push_action_stream_orderings-42 - Found stream ordering 1 day ago: it's 2 -2020-05-02 14:31:12,336 - synapse.storage.data_stores.main - 425 - INFO - generate_user_daily_visits-85 - Calling _generate_user_daily_visits -2020-05-02 14:34:22,322 - synapse.metrics - 464 - INFO - - Collecting gc 1 From 2844fd11e5ca4f7d6ee17a95c2b2d32c73ab73b7 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:50:10 -0600 Subject: [PATCH 05/34] maybe make imports better fuck idunno --- secert-hitler/src/controller/gamemaster/mod.rs | 1 + secert-hitler/src/controller/mod.rs | 2 ++ secert-hitler/src/controller/state/mod.rs | 5 +++++ secert-hitler/src/main.rs | 9 +++------ 4 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 secert-hitler/src/controller/gamemaster/mod.rs create mode 100644 secert-hitler/src/controller/state/mod.rs diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs new file mode 100644 index 0000000..955c71b --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -0,0 +1 @@ +mod gamemaster; diff --git a/secert-hitler/src/controller/mod.rs b/secert-hitler/src/controller/mod.rs index e69de29..26b99ce 100644 --- a/secert-hitler/src/controller/mod.rs +++ b/secert-hitler/src/controller/mod.rs @@ -0,0 +1,2 @@ +mod gamemaster; +mod state; diff --git a/secert-hitler/src/controller/state/mod.rs b/secert-hitler/src/controller/state/mod.rs new file mode 100644 index 0000000..0ba16bf --- /dev/null +++ b/secert-hitler/src/controller/state/mod.rs @@ -0,0 +1,5 @@ +mod event; +mod room; +mod rooms; +mod mockroom; +mod mockrooms; diff --git a/secert-hitler/src/main.rs b/secert-hitler/src/main.rs index 5f819e9..e7ce932 100644 --- a/secert-hitler/src/main.rs +++ b/secert-hitler/src/main.rs @@ -1,10 +1,7 @@ mod config; -#[path = "./controller/gamemaster/gamemaster.rs"] mod gamemaster; -#[path = "./controller/state/event.rs"] mod event; -#[path = "./controller/state/room.rs"] mod room; -#[path = "./controller/state/rooms.rs"] mod rooms; -#[path = "./controller/state/mockroom.rs"] mod mockroom; -#[path = "./controller/state/mockrooms.rs"] mod mockrooms; +mod controller; +mod model; +mod view; fn main() { println!("{}", config::PORT); From 340873205b1dad8c6081a505283c94580b1f6d4c Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 14:51:53 -0600 Subject: [PATCH 06/34] maybe make imports better fuck idunno --- secert-hitler/src/controller/mod.rs | 1 - secert-hitler/src/model/mod.rs | 1 + secert-hitler/src/{controller => model}/state/event.rs | 0 secert-hitler/src/{controller => model}/state/mockroom.rs | 0 secert-hitler/src/{controller => model}/state/mockrooms.rs | 0 secert-hitler/src/{controller => model}/state/mod.rs | 0 secert-hitler/src/{controller => model}/state/room.rs | 0 secert-hitler/src/{controller => model}/state/rooms.rs | 0 8 files changed, 1 insertion(+), 1 deletion(-) rename secert-hitler/src/{controller => model}/state/event.rs (100%) rename secert-hitler/src/{controller => model}/state/mockroom.rs (100%) rename secert-hitler/src/{controller => model}/state/mockrooms.rs (100%) rename secert-hitler/src/{controller => model}/state/mod.rs (100%) rename secert-hitler/src/{controller => model}/state/room.rs (100%) rename secert-hitler/src/{controller => model}/state/rooms.rs (100%) diff --git a/secert-hitler/src/controller/mod.rs b/secert-hitler/src/controller/mod.rs index 26b99ce..955c71b 100644 --- a/secert-hitler/src/controller/mod.rs +++ b/secert-hitler/src/controller/mod.rs @@ -1,2 +1 @@ mod gamemaster; -mod state; diff --git a/secert-hitler/src/model/mod.rs b/secert-hitler/src/model/mod.rs index e69de29..ceecf47 100644 --- a/secert-hitler/src/model/mod.rs +++ b/secert-hitler/src/model/mod.rs @@ -0,0 +1 @@ +mod state; diff --git a/secert-hitler/src/controller/state/event.rs b/secert-hitler/src/model/state/event.rs similarity index 100% rename from secert-hitler/src/controller/state/event.rs rename to secert-hitler/src/model/state/event.rs diff --git a/secert-hitler/src/controller/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs similarity index 100% rename from secert-hitler/src/controller/state/mockroom.rs rename to secert-hitler/src/model/state/mockroom.rs diff --git a/secert-hitler/src/controller/state/mockrooms.rs b/secert-hitler/src/model/state/mockrooms.rs similarity index 100% rename from secert-hitler/src/controller/state/mockrooms.rs rename to secert-hitler/src/model/state/mockrooms.rs diff --git a/secert-hitler/src/controller/state/mod.rs b/secert-hitler/src/model/state/mod.rs similarity index 100% rename from secert-hitler/src/controller/state/mod.rs rename to secert-hitler/src/model/state/mod.rs diff --git a/secert-hitler/src/controller/state/room.rs b/secert-hitler/src/model/state/room.rs similarity index 100% rename from secert-hitler/src/controller/state/room.rs rename to secert-hitler/src/model/state/room.rs diff --git a/secert-hitler/src/controller/state/rooms.rs b/secert-hitler/src/model/state/rooms.rs similarity index 100% rename from secert-hitler/src/controller/state/rooms.rs rename to secert-hitler/src/model/state/rooms.rs From 8971426dcd41e9f619f782cfea7c95525ca939d7 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 2 May 2020 15:09:20 -0600 Subject: [PATCH 07/34] test gamemaster init --- .../src/controller/gamemaster/gamemaster.rs | 37 +++++++++++++++---- .../src/controller/gamemaster/mod.rs | 2 +- secert-hitler/src/controller/mod.rs | 2 +- secert-hitler/src/model/mod.rs | 2 +- secert-hitler/src/model/state/mod.rs | 10 ++--- secert-hitler/src/model/state/rooms.rs | 5 ++- 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index d3ad63e..710892a 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -1,12 +1,13 @@ -#[derive(Debug)] +use super::super::super::model::state::room::Room; + pub struct GameMaster { - room_id: String, + room: Box, } impl GameMaster { - fn new() -> GameMaster { + fn new(room: Box) -> GameMaster { GameMaster{ - room_id: "hello".to_string(), + room: room, } } } @@ -14,10 +15,32 @@ impl GameMaster { #[cfg(test)] mod tests { use super::*; + use super::super::super::super::model::state::mockroom::MockRoom; + use super::super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::super::model::state::rooms::Rooms; #[test] - fn new() { - let gm = GameMaster::new(); - println!("made: {:?}", gm); + fn new_mockroom() { + let _ = GameMaster::new(Box::new(MockRoom::create())); + println!("made"); + } + + #[test] + fn new_rooms_mockrooms() { + fn get() -> impl Rooms { + let mrs = MockRooms::new(); + mrs + } + let mut mrs = get(); + let r = mrs.create(); + let _ = GameMaster::new(r); + } + + + #[test] + fn new_mockrooms() { + let mut mrs = MockRooms::new(); + let r = mrs.create(); + let _ = GameMaster::new(r); } } diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index 955c71b..2d0280a 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1 +1 @@ -mod gamemaster; +pub mod gamemaster; diff --git a/secert-hitler/src/controller/mod.rs b/secert-hitler/src/controller/mod.rs index 955c71b..2d0280a 100644 --- a/secert-hitler/src/controller/mod.rs +++ b/secert-hitler/src/controller/mod.rs @@ -1 +1 @@ -mod gamemaster; +pub mod gamemaster; diff --git a/secert-hitler/src/model/mod.rs b/secert-hitler/src/model/mod.rs index ceecf47..266c62a 100644 --- a/secert-hitler/src/model/mod.rs +++ b/secert-hitler/src/model/mod.rs @@ -1 +1 @@ -mod state; +pub mod state; diff --git a/secert-hitler/src/model/state/mod.rs b/secert-hitler/src/model/state/mod.rs index 0ba16bf..ed4f153 100644 --- a/secert-hitler/src/model/state/mod.rs +++ b/secert-hitler/src/model/state/mod.rs @@ -1,5 +1,5 @@ -mod event; -mod room; -mod rooms; -mod mockroom; -mod mockrooms; +pub mod event; +pub mod room; +pub mod rooms; +pub mod mockroom; +pub mod mockrooms; diff --git a/secert-hitler/src/model/state/rooms.rs b/secert-hitler/src/model/state/rooms.rs index 77a89ba..d5945dd 100644 --- a/secert-hitler/src/model/state/rooms.rs +++ b/secert-hitler/src/model/state/rooms.rs @@ -8,6 +8,7 @@ pub trait Rooms { #[cfg(test)] mod tests { use super::Rooms; + use super::Room; use super::super::mockrooms::MockRooms; #[test] @@ -16,6 +17,8 @@ mod tests { let r = MockRooms::new(); r } - gen(); + let mut rooms = gen(); + let mut room_ptr: Box = rooms.create(); + assert!(room_ptr.send("hi".to_string()).is_ok()); } } From 247e29ce139e2beb0aced09954d3158b84174af2 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 08:14:29 -0600 Subject: [PATCH 08/34] Implement message types and lobby join --- secert-hitler/Cargo.lock | 7 + secert-hitler/Cargo.toml | 1 + .../src/controller/gamemaster/gamemaster.rs | 39 +++++- .../src/controller/gamemaster/lobby.rs | 70 ++++++++++ .../src/controller/gamemaster/mod.rs | 2 + .../src/controller/gamemaster/player.rs | 22 ++++ secert-hitler/src/model/state/event.rs | 123 +++++++++++++++++- testdata/matrix-sandbox/build.sh | 11 +- testdata/matrix-sandbox/synapse-test-log.yaml | 2 +- 9 files changed, 270 insertions(+), 7 deletions(-) create mode 100644 secert-hitler/src/controller/gamemaster/lobby.rs create mode 100644 secert-hitler/src/controller/gamemaster/player.rs diff --git a/secert-hitler/Cargo.lock b/secert-hitler/Cargo.lock index 6d19f0b..c637209 100644 --- a/secert-hitler/Cargo.lock +++ b/secert-hitler/Cargo.lock @@ -44,6 +44,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "json" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" + [[package]] name = "lazy_static" version = "1.4.0" @@ -114,6 +120,7 @@ name = "secert-hitler" version = "0.1.0" dependencies = [ "crossbeam-channel", + "json", "rand", ] diff --git a/secert-hitler/Cargo.toml b/secert-hitler/Cargo.toml index bb12c43..c115ed5 100644 --- a/secert-hitler/Cargo.toml +++ b/secert-hitler/Cargo.toml @@ -9,3 +9,4 @@ edition = "2018" [dependencies] rand = "*" crossbeam-channel = "*" +json = "*" diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 710892a..53b6b48 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -1,3 +1,4 @@ +/* use super::super::super::model::state::room::Room; pub struct GameMaster { @@ -10,6 +11,24 @@ impl GameMaster { room: room, } } + + fn run(&self) -> Result { + self.run_lobby()?; + self.run_game_setup()?; + self.run_game() + } + + fn run_lobby(&self) -> Result { + Err("not impl".to_string()) + } + + fn run_game_setup(&self) -> Result { + Err("not impl".to_string()) + } + + fn run_game(&self) -> Result { + Err("not impl".to_string()) + } } #[cfg(test)] @@ -36,11 +55,29 @@ mod tests { let _ = GameMaster::new(r); } - #[test] fn new_mockrooms() { let mut mrs = MockRooms::new(); let r = mrs.create(); let _ = GameMaster::new(r); } + + #[test] + fn gm_run_lobby_fail() { + let gm = GameMaster::new(Box::new(MockRoom::create())); + panic!("not impl"); + } + + #[test] + fn gm_run_game_setup_fail() { + let gm = GameMaster::new(Box::new(MockRoom::create())); + panic!("not impl"); + } + + #[test] + fn gm_run_game_fail() { + let gm = GameMaster::new(Box::new(MockRoom::create())); + panic!("not impl"); + } } +*/ diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs new file mode 100644 index 0000000..5ba5d7e --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -0,0 +1,70 @@ +use super::player::Player; +use super::super::super::model::state::event::Event; + +use std::collections::HashMap; + +pub struct Lobby { + players: HashMap, +} + +impl Lobby { + fn new() -> Lobby { + Lobby{ + players: HashMap::new(), + } + } + + fn eat(&mut self, message: Event) { + let j = message.join(); + if j.is_none() { + return; + } + let id = j.unwrap(); + self.players.insert(id.clone(), Player::new(id)); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn _dummy_event(m: &str) -> Event { + Event{ + body: m.to_string(), + next: "a".to_string(), + sender: "b".to_string(), + } + } + + #[test] + fn new_lobby() { + let _ = Lobby::new(); + } + + #[test] + fn eat_join() { + let mut l = Lobby::new(); + let e = _dummy_event(r#"{"membership": "join", "displayname": "a"}"#); + let was = l.players.len(); + l.eat(e); + assert!(was+1 == l.players.len(), "want {}, got {}: {:?}", was+1, l.players.len(), l.players); + } + + #[test] + fn eat_join_malformatted() { + let mut l = Lobby::new(); + let e = _dummy_event(r#"{"membership": "join"}"#); + let was = l.players.len(); + l.eat(e); + assert!(was == l.players.len()); + } + + #[test] + fn eat_null() { + let mut l = Lobby::new(); + let e = _dummy_event(r#"{"hello": "world"}"#); + let was = l.players.len(); + l.eat(e); + assert!(was == l.players.len()); + } +} diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index 2d0280a..bcb677e 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1 +1,3 @@ pub mod gamemaster; +pub mod player; +pub mod lobby; diff --git a/secert-hitler/src/controller/gamemaster/player.rs b/secert-hitler/src/controller/gamemaster/player.rs new file mode 100644 index 0000000..cd96c6a --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/player.rs @@ -0,0 +1,22 @@ +#[derive(Clone, Debug)] +pub struct Player { + id: String, +} + +impl Player { + pub fn new(id: String) -> Player { + Player { + id: id, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new_player() { + let _ = Player::new("id".to_string()); + } +} diff --git a/secert-hitler/src/model/state/event.rs b/secert-hitler/src/model/state/event.rs index b8f5492..e4f6a61 100644 --- a/secert-hitler/src/model/state/event.rs +++ b/secert-hitler/src/model/state/event.rs @@ -1,3 +1,5 @@ +use json; + #[derive(Clone, Debug)] pub struct Event { pub sender: String, @@ -5,15 +7,134 @@ pub struct Event { pub next: String, } +#[derive(PartialEq, Eq, Debug)] +pub enum EventType { + Null, + Join, + Create, + Message, +} + +impl Event { + pub fn mode(&self) -> EventType { + let d = json::parse(&self.body).unwrap(); + if d["membership"].is_string() { + return match d["membership"].as_str().unwrap().to_string().as_ref() { + "join" => EventType::Join, + _ => EventType::Null, + }; + } + if d["creator"].is_string() { + return EventType::Create; + } + if d["msgtype"].is_string() { + return match d["msgtype"].as_str().unwrap().to_string().as_ref() { + "m.text" => EventType::Message, + _ => EventType::Null, + }; + } + EventType::Null + } + + pub fn join(&self) -> Option { + let d = json::parse(&self.body).unwrap(); + match self.mode() { + EventType::Join => true, + _ => return None, + }; + let o = d["displayname"].as_str(); + if o.is_none() { + return None; + } + Some(o.unwrap().to_string()) + } +} + #[cfg(test)] mod tests { + use super::*; + + fn _dummy() -> Event { + Event{ + sender: "sender".to_string(), + body: r#"{}"#.to_string(), + next: "next".to_string(), + } + } + #[test] fn event() { - let e = super::Event{ + let e = Event{ sender: "sender".to_string(), body: "body".to_string(), next: "next".to_string(), }; println!("{:?}", e); } + + #[test] + fn mode_null() { + let mut e = _dummy(); + e.body = r#"{ + }"#.to_string(); + assert!(e.mode() == EventType::Null); + } + + #[test] + fn mode_create() { + let mut e = _dummy(); + e.body = r#"{ + "creator": "abc" + }"#.to_string(); + assert!(e.mode() == EventType::Create); + } + + #[test] + fn mode_msgtype() { + let mut e = _dummy(); + e.body = r#"{ + "msgtype": "m.text" + }"#.to_string(); + assert!(e.mode() == EventType::Message); + } + + #[test] + fn mode_join() { + let mut e = _dummy(); + e.body = r#"{ + "membership": "join" + }"#.to_string(); + assert!(e.mode() == EventType::Join); + } + + #[test] + fn join_some() { + let mut e = _dummy(); + e.body = r#"{ + "displayname": "hi", + "membership": "join" + }"#.to_string(); + let j = e.join(); + assert!(j.is_some()); + } + + #[test] + fn join_some_bad() { + let mut e = _dummy(); + e.body = r#"{ + "membership": "join" + }"#.to_string(); + let j = e.join(); + assert!(j.is_none()); + } + + #[test] + fn join_none() { + let mut e = _dummy(); + e.body = r#"{ + "a": "b" + }"#.to_string(); + let j = e.join(); + assert!(j.is_none()); + } } diff --git a/testdata/matrix-sandbox/build.sh b/testdata/matrix-sandbox/build.sh index dc4e997..afe6a3c 100644 --- a/testdata/matrix-sandbox/build.sh +++ b/testdata/matrix-sandbox/build.sh @@ -82,10 +82,12 @@ out="$( -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ | jq '{"timeline": .rooms.join[].timeline.events[], "next": .next_batch}' \ - | jq '{"content": .timeline.content.body, "sender": .timeline.sender, "next": .next}' + | jq '{"content": .timeline.content, "sender": .timeline.sender, "next": .next}' \ )" -printf "%s\n" "$out" -since="$(echo "$out" | jq -r .next | tail -n 1)" +printf "%s\n" "$out" | jq . +since="$( + echo "$out" \ + | jq -r .next | tail -n 1)" # send new message txid="$(cat /proc/sys/kernel/random/uuid)" @@ -112,5 +114,6 @@ curl -sS "http://localhost:39487/_matrix/client/r0/sync?since=$since" \ -H 'content-type: application/json' \ -H 'Authorization: Bearer '"$access_token" \ | jq '{"timeline": .rooms.join[].timeline.events[], "next": .next_batch}' \ - | jq '{"content": .timeline.content.body, "sender": .timeline.sender, "next": .next}' + | jq '{"content": .timeline.content, "sender": .timeline.sender, "next": .next}' \ + | jq . diff --git a/testdata/matrix-sandbox/synapse-test-log.yaml b/testdata/matrix-sandbox/synapse-test-log.yaml index 91633e4..b8bb22f 100644 --- a/testdata/matrix-sandbox/synapse-test-log.yaml +++ b/testdata/matrix-sandbox/synapse-test-log.yaml @@ -20,7 +20,7 @@ handlers: file: class: logging.handlers.RotatingFileHandler formatter: precise - filename: /home/bel/Go/src/local/containers/secret-hitler-via-matrix/testdata/matrix-sandbox/homeserver.log + filename: /tmp/synapse-test-real.log maxBytes: 104857600 backupCount: 10 filters: [context] From 9e89ced1e2907e8a7e2e19c1879ae233d2280492 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 08:16:08 -0600 Subject: [PATCH 09/34] Implement message types and lobby join --- .../src/controller/gamemaster/role.rs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 secert-hitler/src/controller/gamemaster/role.rs diff --git a/secert-hitler/src/controller/gamemaster/role.rs b/secert-hitler/src/controller/gamemaster/role.rs new file mode 100644 index 0000000..efb6fe8 --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/role.rs @@ -0,0 +1,26 @@ +#[derive(Clone, Debug)] +pub struct Role { + role: Roles, +} + +pub enum Roles { + Null, +} + +impl Role { + pub fn new() -> Role { + Role { + role: Roles::Null, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new_role() { + let _ = Role::new(); + } +} From 5da81e3f9155b071e5946f89a80f6e90312c8c8e Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 09:22:23 -0600 Subject: [PATCH 10/34] update mockrooms so join emits join message --- .../src/controller/gamemaster/gamemaster.rs | 45 ++++--- .../src/controller/gamemaster/lobby.rs | 19 ++- .../src/controller/gamemaster/mod.rs | 1 + .../src/controller/gamemaster/player.rs | 9 ++ .../src/controller/gamemaster/role.rs | 90 ++++++++++++++ secert-hitler/src/model/state/event.rs | 6 +- secert-hitler/src/model/state/mockroom.rs | 110 ++++++++++++------ secert-hitler/src/model/state/mockrooms.rs | 8 +- secert-hitler/src/model/state/room.rs | 2 + 9 files changed, 233 insertions(+), 57 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 53b6b48..2cdc170 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -1,32 +1,45 @@ -/* use super::super::super::model::state::room::Room; +use super::lobby::Lobby; pub struct GameMaster { room: Box, + lobby: Lobby, } impl GameMaster { fn new(room: Box) -> GameMaster { GameMaster{ room: room, + lobby: Lobby::new(), } } - fn run(&self) -> Result { + fn run(&mut self) -> Result { self.run_lobby()?; self.run_game_setup()?; self.run_game() } - fn run_lobby(&self) -> Result { + fn run_lobby(&mut self) -> Result { + println!(". run lobby"); + loop { + let rollback = self.room.since(); + let events = self.room.sync(); + println!(". rollback: {:?}", rollback); + for e in &events { + println!("e: {:?}", e); + } + self.room.rollback(rollback); + break + } Err("not impl".to_string()) } - fn run_game_setup(&self) -> Result { + fn run_game_setup(&mut self) -> Result { Err("not impl".to_string()) } - fn run_game(&self) -> Result { + fn run_game(&mut self) -> Result { Err("not impl".to_string()) } } @@ -63,21 +76,25 @@ mod tests { } #[test] - fn gm_run_lobby_fail() { + fn run_lobby() { + let mut mrs = MockRooms::new(); + let mut r1 = mrs.create(); + let room_id = r1.room_id(); + let mut gm = GameMaster::new(r1); + let mut r2 = mrs.join(room_id).unwrap(); + gm.run_lobby(); + assert!(gm.lobby.players.len() == 1, "players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + } + + #[test] + fn run_game_setup_fail() { let gm = GameMaster::new(Box::new(MockRoom::create())); panic!("not impl"); } #[test] - fn gm_run_game_setup_fail() { - let gm = GameMaster::new(Box::new(MockRoom::create())); - panic!("not impl"); - } - - #[test] - fn gm_run_game_fail() { + fn run_game_fail() { let gm = GameMaster::new(Box::new(MockRoom::create())); panic!("not impl"); } } -*/ diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs index 5ba5d7e..9c25896 100644 --- a/secert-hitler/src/controller/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -4,17 +4,22 @@ use super::super::super::model::state::event::Event; use std::collections::HashMap; pub struct Lobby { - players: HashMap, + pub players: HashMap, + locked: bool, } impl Lobby { - fn new() -> Lobby { + pub fn new() -> Lobby { Lobby{ players: HashMap::new(), + locked: false, } } - - fn eat(&mut self, message: Event) { + + pub fn eat(&mut self, message: Event) { + if self.locked { + return; + } let j = message.join(); if j.is_none() { return; @@ -22,6 +27,10 @@ impl Lobby { let id = j.unwrap(); self.players.insert(id.clone(), Player::new(id)); } + + pub fn lock(&mut self) { + self.locked = true; + } } #[cfg(test)] @@ -31,7 +40,7 @@ mod tests { fn _dummy_event(m: &str) -> Event { Event{ body: m.to_string(), - next: "a".to_string(), + since: "a".to_string(), sender: "b".to_string(), } } diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index bcb677e..32b9e75 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,3 +1,4 @@ pub mod gamemaster; pub mod player; +pub mod role; pub mod lobby; diff --git a/secert-hitler/src/controller/gamemaster/player.rs b/secert-hitler/src/controller/gamemaster/player.rs index cd96c6a..d1ccacd 100644 --- a/secert-hitler/src/controller/gamemaster/player.rs +++ b/secert-hitler/src/controller/gamemaster/player.rs @@ -1,14 +1,23 @@ +use super::role::Role; +use super::role::Roles; + #[derive(Clone, Debug)] pub struct Player { id: String, + role: Role, } impl Player { pub fn new(id: String) -> Player { Player { id: id, + role: Role::new(), } } + + fn set_role(&mut self, role: Roles) { + self.role.set(role); + } } #[cfg(test)] diff --git a/secert-hitler/src/controller/gamemaster/role.rs b/secert-hitler/src/controller/gamemaster/role.rs index efb6fe8..9077e2f 100644 --- a/secert-hitler/src/controller/gamemaster/role.rs +++ b/secert-hitler/src/controller/gamemaster/role.rs @@ -3,8 +3,12 @@ pub struct Role { role: Roles, } +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Roles { Null, + Facist, + Hitler, + Liberal, } impl Role { @@ -13,6 +17,22 @@ impl Role { role: Roles::Null, } } + + pub fn set(&mut self, role: Roles) { + self.role = role + } + + pub fn is_hitler(&self) -> bool { + self.role == Roles::Hitler + } + + pub fn is_facist(&self) -> bool { + self.role == Roles::Facist || self.is_hitler() + } + + pub fn is_liberal(&self) -> bool { + self.role == Roles::Liberal + } } #[cfg(test)] @@ -23,4 +43,74 @@ mod tests { fn new_role() { let _ = Role::new(); } + + #[test] + fn set() { + let mut r = Role::new(); + r.set(Roles::Facist); + assert!(r.role == Roles::Facist); + } + + #[test] + fn is_hitler_liberal() { + let mut r = Role::new(); + r.set(Roles::Liberal); + assert!(!r.is_hitler()); + } + + #[test] + fn is_hitler_facist() { + let mut r = Role::new(); + r.set(Roles::Facist); + assert!(!r.is_hitler()); + } + + #[test] + fn is_hitler_yes() { + let mut r = Role::new(); + r.set(Roles::Hitler); + assert!(r.is_hitler()); + } + + #[test] + fn is_facist_liberal() { + let mut r = Role::new(); + r.set(Roles::Liberal); + assert!(!r.is_facist()); + } + + #[test] + fn is_facist_facist() { + let mut r = Role::new(); + r.set(Roles::Facist); + assert!(r.is_facist()); + } + + #[test] + fn is_facist_hitler() { + let mut r = Role::new(); + r.set(Roles::Hitler); + assert!(r.is_facist()); + } + + #[test] + fn is_liberal_liberal() { + let mut r = Role::new(); + r.set(Roles::Liberal); + assert!(r.is_liberal()); + } + + #[test] + fn is_liberal_facist() { + let mut r = Role::new(); + r.set(Roles::Facist); + assert!(!r.is_liberal()); + } + + #[test] + fn is_liberal_hitler() { + let mut r = Role::new(); + r.set(Roles::Hitler); + assert!(!r.is_liberal()); + } } diff --git a/secert-hitler/src/model/state/event.rs b/secert-hitler/src/model/state/event.rs index e4f6a61..883e984 100644 --- a/secert-hitler/src/model/state/event.rs +++ b/secert-hitler/src/model/state/event.rs @@ -4,7 +4,7 @@ use json; pub struct Event { pub sender: String, pub body: String, - pub next: String, + pub since: String, } #[derive(PartialEq, Eq, Debug)] @@ -58,7 +58,7 @@ mod tests { Event{ sender: "sender".to_string(), body: r#"{}"#.to_string(), - next: "next".to_string(), + since: "since".to_string(), } } @@ -67,7 +67,7 @@ mod tests { let e = Event{ sender: "sender".to_string(), body: "body".to_string(), - next: "next".to_string(), + since: "since".to_string(), }; println!("{:?}", e); } diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index 82f08fa..fd6c3c4 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -7,7 +7,7 @@ use crossbeam_channel::{unbounded, Sender, Receiver}; #[derive(Clone, Debug)] pub struct MockRoom { - last: String, + since: String, room_id: String, events_s: Sender>, events_r: Receiver>, @@ -21,41 +21,28 @@ impl MockRoom { pub fn join(room_id: String) -> MockRoom { let (s, r) = unbounded(); s.send(vec![]).ok().unwrap(); - MockRoom { - last: "".to_string(), - room_id: room_id, + let mut mr = MockRoom { + since: "".to_string(), + room_id: room_id.clone(), events_s: s, events_r: r, - } + }; + let id = rands(); + mr.send_as(id.clone(), format!(r#"{{ + "displayname": "{}", + "membership": "join" + }}"#, id.clone())).unwrap(); + mr } pub fn room(&self) -> impl Room { self.clone() } -} -impl Room for MockRoom { - fn sync(&mut self) -> Vec { - let mut unseen: Vec = vec![]; - let mut last = self.last.clone(); - let events = self.events_r.recv().ok().unwrap(); - for e in &events { - if e.next == self.last { - unseen.clear(); - } else { - unseen.push(e.clone()); - last = e.next.clone(); - } - } - self.events_s.send(events).ok().unwrap(); - self.last = last; - return unseen; - } - - fn send(&mut self, message: String) -> Result<&str, &str> { + pub fn send_as(&mut self, id: String, message: String) -> Result<&str, &str> { let e = Event{ - sender: rands(), - next: rands(), + sender: id, + since: rands(), body: message, }; let mut events = self.events_r.recv().ok().unwrap(); @@ -64,9 +51,41 @@ impl Room for MockRoom { Ok("ok") } +} + +impl Room for MockRoom { + fn sync(&mut self) -> Vec { + let mut unseen: Vec = vec![]; + let mut since = self.since.clone(); + let events = self.events_r.recv().ok().unwrap(); + for e in &events { + if e.since == self.since { + unseen.clear(); + } else { + unseen.push(e.clone()); + since = e.since.clone(); + } + } + self.events_s.send(events).ok().unwrap(); + self.since = since; + return unseen; + } + + fn send(&mut self, message: String) -> Result<&str, &str> { + self.send_as(rands(), message) + } + fn room_id(&self) -> String { self.room_id.clone() } + + fn rollback(&mut self, since: String) { + self.since = since; + } + + fn since(&self) -> String { + self.since.clone() + } } impl Drop for MockRoom { @@ -91,12 +110,12 @@ mod tests { fn _dummy() -> MockRoom { let mut r = MockRoom::create(); - r.last = "1".to_string(); + r.since = "1".to_string(); let mut events = r.events_r.recv().ok().unwrap(); for i in 0..5 { events.push(Event{ sender: i.to_string(), - next: i.to_string(), + since: i.to_string(), body: i.to_string(), }); } @@ -120,8 +139,17 @@ mod tests { #[test] fn join() { let rid = "a".to_string(); - let r: MockRoom = MockRoom::join(rid.to_string()); + let mut r: MockRoom = MockRoom::join(rid.to_string()); assert!(r.room_id == rid); + let events = r.sync(); + let mut found = false; + for e in &events { + let j = e.join(); + if j.is_some() { + found = true; + } + } + assert!(found); } #[test] @@ -131,8 +159,8 @@ mod tests { assert!(events.len() == 3, "want {}, got {}: {:?}", 3, events.len(), events); assert!(events[0].sender == "2"); assert!(events[0].body == "2"); - assert!(events[0].next == "2"); - assert!(r.last == "4", "want last==4, got {}", r.last); + assert!(events[0].since == "2"); + assert!(r.since == "4", "want since==4, got {}", r.since); } #[test] @@ -141,10 +169,24 @@ mod tests { let message = "message".to_string(); r.sync(); assert!(r.send(message.clone()).ok().unwrap() == "ok"); - assert!(r.last == "4"); + assert!(r.since == "4"); let events = r.sync(); assert!(events.len() == 1); assert!(events[0].body == message, "want {}, got {}: {:?}", message, events[0].body, events); - assert!(r.last != "4"); + assert!(r.since != "4"); + } + + #[test] + fn rollback() { + let mut r = _dummy(); + let was = r.since.to_string(); + let events = r.sync(); + assert!(events.len() == 3); + assert!(r.since == "4"); + r.rollback(was.to_string()); + assert!(r.since == was); + let events = r.sync(); + assert!(events.len() == 3); + assert!(r.since == "4"); } } diff --git a/secert-hitler/src/model/state/mockrooms.rs b/secert-hitler/src/model/state/mockrooms.rs index 9b1f042..b71feb2 100644 --- a/secert-hitler/src/model/state/mockrooms.rs +++ b/secert-hitler/src/model/state/mockrooms.rs @@ -1,6 +1,7 @@ use super::rooms::Rooms; use super::room::Room; use super::mockroom::MockRoom; +use super::mockroom::rands; // #[derive(Clone, Debug)] pub struct MockRooms { @@ -26,7 +27,12 @@ impl Rooms for MockRooms { fn join(&self, room_id: String) -> Result, &str> { for r in &self.rooms { if r.room_id() == room_id { - return Ok(Box::new(r.room())); + let mut r = r.room(); + r.send(format!(r#"{{ + "displayname": "{}", + "membership": "join" + }}"#, rands())); + return Ok(Box::new(r)); } } Err("not found") diff --git a/secert-hitler/src/model/state/room.rs b/secert-hitler/src/model/state/room.rs index 9102d5f..4771ef3 100644 --- a/secert-hitler/src/model/state/room.rs +++ b/secert-hitler/src/model/state/room.rs @@ -1,9 +1,11 @@ use super::event; pub trait Room { + fn rollback(&mut self, since: String); fn sync(&mut self) -> Vec; fn send(&mut self, message: String) -> Result<&str, &str>; fn room_id(&self) -> String; + fn since(&self) -> String; } #[cfg(test)] From cbb8bbec40e523110d07ad6b3009cb7d51e3eb1c Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 09:49:38 -0600 Subject: [PATCH 11/34] fix bad sync against no messages for mockroom --- .../src/controller/gamemaster/gamemaster.rs | 4 ++ .../src/controller/gamemaster/mod.rs | 2 +- secert-hitler/src/model/state/mockroom.rs | 49 +++++++++++++++++-- secert-hitler/src/model/state/mockrooms.rs | 29 ++++++++--- secert-hitler/src/model/state/room.rs | 2 +- 5 files changed, 73 insertions(+), 13 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 2cdc170..2ab4484 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -82,6 +82,10 @@ mod tests { let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); let mut r2 = mrs.join(room_id).unwrap(); + r2.send(r#"{ + "msgtype": "m.text", + "body": "" + }"#); gm.run_lobby(); assert!(gm.lobby.players.len() == 1, "players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); } diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index 32b9e75..1d8e735 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,4 +1,4 @@ -pub mod gamemaster; +// pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index fd6c3c4..1c6f6e8 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -39,16 +39,17 @@ impl MockRoom { self.clone() } - pub fn send_as(&mut self, id: String, message: String) -> Result<&str, &str> { + pub fn send_as(&mut self, id: String, message: String) -> Result { + let since = rands(); let e = Event{ sender: id, - since: rands(), + since: since.clone(), body: message, }; let mut events = self.events_r.recv().ok().unwrap(); events.push(e); self.events_s.send(events).ok().unwrap(); - Ok("ok") + Ok(since.clone()) } } @@ -61,6 +62,7 @@ impl Room for MockRoom { for e in &events { if e.since == self.since { unseen.clear(); + since = self.since.clone(); } else { unseen.push(e.clone()); since = e.since.clone(); @@ -71,7 +73,7 @@ impl Room for MockRoom { return unseen; } - fn send(&mut self, message: String) -> Result<&str, &str> { + fn send(&mut self, message: String) -> Result { self.send_as(rands(), message) } @@ -152,6 +154,43 @@ mod tests { assert!(found); } + #[test] + fn since_tracking_push_two() { + let mut r = _dummy(); + r.sync(); + let mut sinces = vec![]; + for i in 0..10 { + sinces.push(r.send("0".to_string()).ok().unwrap()); + sinces.push(r.send("0".to_string()).ok().unwrap()); + r.sync(); + assert!(r.since == sinces[sinces.len()-1]); + } + } + + #[test] + fn since_tracking_push_one() { + let mut r = _dummy(); + r.sync(); + let mut sinces = vec![]; + for i in 0..10 { + sinces.push(r.send("0".to_string()).ok().unwrap()); + r.sync(); + assert!(r.since == sinces[sinces.len()-1]); + } + } + + #[test] + fn since_tracking_push_none() { + let mut r = _dummy(); + r.sync(); + let mut sinces = vec![]; + sinces.push(r.send("0".to_string()).ok().unwrap()); + assert!(r.sync().len() == 1); + assert!(r.since == sinces[sinces.len()-1], "after one send: want {:?}, got {:?}: {:?}", sinces[sinces.len()-1], r.since, sinces); + assert!(r.sync().len() == 0); + assert!(r.since == sinces[sinces.len()-1], "after no send: want {:?}, got {:?}: {:?}", sinces[sinces.len()-1], r.since, sinces); + } + #[test] fn sync() { let mut r = _dummy(); @@ -168,7 +207,7 @@ mod tests { let mut r = _dummy(); let message = "message".to_string(); r.sync(); - assert!(r.send(message.clone()).ok().unwrap() == "ok"); + assert!(r.send(message.clone()).ok().unwrap().len() > 0); assert!(r.since == "4"); let events = r.sync(); assert!(events.len() == 1); diff --git a/secert-hitler/src/model/state/mockrooms.rs b/secert-hitler/src/model/state/mockrooms.rs index b71feb2..2167441 100644 --- a/secert-hitler/src/model/state/mockrooms.rs +++ b/secert-hitler/src/model/state/mockrooms.rs @@ -98,14 +98,31 @@ mod tests { let mrs = _dummy(); let mut a = mrs.join("0".to_string()).ok().unwrap(); let mut b = mrs.join("0".to_string()).ok().unwrap(); + assert!(a.room_id() == b.room_id()); - assert!(a.sync().len() == b.sync().len()); - assert!(a.sync().len() == b.sync().len()); - assert!(a.sync().len() == 0); - assert!(b.sync().len() == 0); + + let ea = a.sync(); + let eb = b.sync(); + println!("a1: {:?}, {:?}, {:?}", a.since(), a.room_id(), ea); + println!("b1: {:?}, {:?}, {:?}", b.since(), a.room_id(), eb); + assert!(ea.len() == eb.len()); + + let ea = a.sync(); + let eb = b.sync(); + println!("a2: {:?}, {:?}, {:?}", a.since(), a.room_id(), ea); + println!("b2: {:?}, {:?}, {:?}", b.since(), a.room_id(), eb); + assert!(ea.len() == eb.len()); + assert!(ea.len() == 0); + assert!(eb.len() == 0); + assert!(a.send("from a".to_string()).is_ok()); - assert!(a.sync().len() == 1); - assert!(b.sync().len() == 1); + let ea = a.sync(); + let eb = b.sync(); + println!("a3: {:?}, {:?}, {:?}", a.since(), a.room_id(), ea); + println!("b3: {:?}, {:?}, {:?}", b.since(), a.room_id(), eb); + assert!(ea.len() == 1, "a sent a message and a received {}: {:?}", ea.len(), ea); + assert!(eb.len() == 1, "a sent a message and b received {}: {:?}", ea.len(), eb); + assert!(b.send("from b".to_string()).is_ok()); assert!(b.send("from b".to_string()).is_ok()); assert!(a.sync().len() == 2); diff --git a/secert-hitler/src/model/state/room.rs b/secert-hitler/src/model/state/room.rs index 4771ef3..b5bb4c1 100644 --- a/secert-hitler/src/model/state/room.rs +++ b/secert-hitler/src/model/state/room.rs @@ -3,7 +3,7 @@ use super::event; pub trait Room { fn rollback(&mut self, since: String); fn sync(&mut self) -> Vec; - fn send(&mut self, message: String) -> Result<&str, &str>; + fn send(&mut self, message: String) -> Result; fn room_id(&self) -> String; fn since(&self) -> String; } From 6fb3feeeacdaf767dbd545af168a4aa43c6901fe Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 11:19:42 -0600 Subject: [PATCH 12/34] impl run lobby without checks --- .../src/controller/gamemaster/gameevent.rs | 162 ++++++++++++++++++ .../src/controller/gamemaster/gamemaster.rs | 51 ++++-- .../src/controller/gamemaster/lobby.rs | 2 +- .../src/controller/gamemaster/mod.rs | 3 +- secert-hitler/src/model/state/mockroom.rs | 4 +- secert-hitler/src/model/state/mockrooms.rs | 2 +- 6 files changed, 201 insertions(+), 23 deletions(-) create mode 100644 secert-hitler/src/controller/gamemaster/gameevent.rs diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs new file mode 100644 index 0000000..d51c43b --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -0,0 +1,162 @@ +use super::super::super::model::state::event::Event; +use json; + +#[derive(Clone, Debug)] +pub struct GameEvent { + d: json::JsonValue, +} + +#[derive(PartialEq, Eq, Debug)] +pub enum GameEventType { + Null, + GameStart, + RoleSet, + ElectionPend, + ElectionSet, + VoteSet, + CardPend, + CardPick, + PolicySet, + SpecialInspect, + SpecialSelect, + SpecialKill, + SpecialPeek, + GameStop, +} + +impl GameEventType { + fn from_string(s: String) -> GameEventType { + match s.as_ref() { + "Null" => return GameEventType::Null, + "GameStart" => return GameEventType::GameStart, + "RoleSet" => return GameEventType::RoleSet, + "ElectionPend" => return GameEventType::ElectionPend, + "ElectionSet" => return GameEventType::ElectionSet, + "VoteSet" => return GameEventType::VoteSet, + "CardPend" => return GameEventType::CardPend, + "CardPick" => return GameEventType::CardPick, + "PolicySet" => return GameEventType::PolicySet, + "SpecialInspect" => return GameEventType::SpecialInspect, + "SpecialSelect" => return GameEventType::SpecialSelect, + "SpecialKill" => return GameEventType::SpecialKill, + "SpecialPeek" => return GameEventType::SpecialPeek, + "GameStop" => return GameEventType::GameStop, + _ => return GameEventType::Null, + } + } +} + +impl GameEvent { + pub fn new(body: String) -> GameEvent { + let top_level = json::parse(&body); + if top_level.is_err() { + return GameEvent{d: json::Null}; + } + let top_level = top_level.unwrap(); + if !top_level["body"].is_string() { + return GameEvent{d: json::Null}; + } + GameEvent{ + d: json::parse(&top_level["body"].as_str().unwrap()).unwrap_or(json::Null), + } + } + + pub fn mode(&self) -> GameEventType { + if self.d.is_null() { + return GameEventType::Null; + } + if !self.d["GameEventType"].is_string() { + return GameEventType::Null; + } + let s = self.d["GameEventType"].as_str().unwrap().to_string(); + GameEventType::from_string(s.to_string()) + } + + pub fn sources(&self) -> Vec { + self.str_vec("sources") + } + + pub fn targets(&self) -> Vec { + self.str_vec("targets") + } + + pub fn params(&self) -> Vec { + self.str_vec("params") + } + + fn str_vec(&self, key: &str) -> Vec { + let mut out = vec![]; + if self.d[key].is_string() { + out.push(self.d[key].as_str().unwrap().to_string()); + return out; + } + if self.d[key].is_array() { + let iter = self.d[key].members(); + for i in iter { + if !i.is_string() { + return vec![]; + } + out.push(i.as_str().unwrap().to_string()); + } + return out; + } + out + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new() { + let ge = GameEvent::new("\"a\"".to_string()); + assert!(ge.d.is_null()); + + let ge = GameEvent::new("a".to_string()); + assert!(ge.d.is_null()); + assert!(ge.mode() == GameEventType::Null); + } + + #[test] + fn type_from_string() { + assert!(GameEventType::from_string("Null".to_string()) == GameEventType::Null); + assert!(GameEventType::from_string("GameStart".to_string()) == GameEventType::GameStart); + assert!(GameEventType::from_string("RoleSet".to_string()) == GameEventType::RoleSet); + assert!(GameEventType::from_string("ElectionPend".to_string()) == GameEventType::ElectionPend); + assert!(GameEventType::from_string("ElectionSet".to_string()) == GameEventType::ElectionSet); + assert!(GameEventType::from_string("VoteSet".to_string()) == GameEventType::VoteSet); + assert!(GameEventType::from_string("CardPend".to_string()) == GameEventType::CardPend); + assert!(GameEventType::from_string("CardPick".to_string()) == GameEventType::CardPick); + assert!(GameEventType::from_string("PolicySet".to_string()) == GameEventType::PolicySet); + assert!(GameEventType::from_string("SpecialInspect".to_string()) == GameEventType::SpecialInspect); + assert!(GameEventType::from_string("SpecialSelect".to_string()) == GameEventType::SpecialSelect); + assert!(GameEventType::from_string("SpecialKill".to_string()) == GameEventType::SpecialKill); + assert!(GameEventType::from_string("SpecialPeek".to_string()) == GameEventType::SpecialPeek); + assert!(GameEventType::from_string("GameStop".to_string()) == GameEventType::GameStop); + } + + #[test] + fn sources() { + let ge = GameEvent::new(r#"{"body": "{\"sources\": [\"a\", \"b\"]}"}"#.to_string()); + assert!(ge.sources() == vec!["a", "b"]); + } + + #[test] + fn targets() { + let ge = GameEvent::new(r#"{"body": "{\"targets\": [\"a\", \"b\"]}"}"#.to_string()); + assert!(ge.targets() == vec!["a", "b"]); + } + + #[test] + fn params() { + let ge = GameEvent::new(r#"{"body": "{\"params\": [\"a\", \"b\"]}"}"#.to_string()); + assert!(ge.params() == vec!["a", "b"]); + + let ge = GameEvent::new(r#"{"body": "{\"params\": []}"}"#.to_string()); + assert!(ge.params().len() == 0); + + let ge = GameEvent::new(r#"{"body": "{}"}"#.to_string()); + assert!(ge.params().len() == 0); + } +} diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 2ab4484..7d214fa 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -1,5 +1,9 @@ use super::super::super::model::state::room::Room; use super::lobby::Lobby; +use super::gameevent::GameEvent; +use super::gameevent::GameEventType; +use std::thread; +use std::time; pub struct GameMaster { room: Box, @@ -21,18 +25,24 @@ impl GameMaster { } fn run_lobby(&mut self) -> Result { - println!(". run lobby"); - loop { + while !self.lobby.locked { let rollback = self.room.since(); let events = self.room.sync(); - println!(". rollback: {:?}", rollback); + println!("top of loop: since={:?}, events={:?}", self.room.since(), events); for e in &events { - println!("e: {:?}", e); + let ge = GameEvent::new(e.body.clone()); + println!(" ge.mode = {:?}", ge.mode()); + if ge.mode() == GameEventType::GameStart { + println!(" should return"); + self.room.rollback(e.since.clone()); + self.lobby.lock(); + return Ok("ok".to_string()); + } + self.lobby.eat(e.clone()); } - self.room.rollback(rollback); - break + thread::sleep(time::Duration::new(1, 0)); } - Err("not impl".to_string()) + Ok("ok".to_string()) // todo: on lobby too small, return err and do not lock } fn run_game_setup(&mut self) -> Result { @@ -54,7 +64,6 @@ mod tests { #[test] fn new_mockroom() { let _ = GameMaster::new(Box::new(MockRoom::create())); - println!("made"); } #[test] @@ -78,27 +87,33 @@ mod tests { #[test] fn run_lobby() { let mut mrs = MockRooms::new(); - let mut r1 = mrs.create(); + let r1 = mrs.create(); let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); let mut r2 = mrs.join(room_id).unwrap(); - r2.send(r#"{ + r2.send(format!(r#"{{ "msgtype": "m.text", - "body": "" - }"#); - gm.run_lobby(); - assert!(gm.lobby.players.len() == 1, "players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); // TODO mark end of new players + gm.run_lobby(); // todo assert is_ok + assert!(gm.lobby.players.len() == 2, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + let mut players1 = vec![]; + for k in gm.lobby.players.keys() { + players1.push(k.clone()); + } + gm.run_lobby(); // todo assert is_ok + assert!(gm.lobby.players.len() == 2, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + let players2 = gm.lobby.players.keys(); + assert!(format!("{:?}", players1) == format!("{:?}", players2)); } #[test] fn run_game_setup_fail() { - let gm = GameMaster::new(Box::new(MockRoom::create())); - panic!("not impl"); + assert!(false, "not impl"); } #[test] fn run_game_fail() { - let gm = GameMaster::new(Box::new(MockRoom::create())); - panic!("not impl"); + assert!(false, "not impl"); } } diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs index 9c25896..73e7b70 100644 --- a/secert-hitler/src/controller/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; pub struct Lobby { pub players: HashMap, - locked: bool, + pub locked: bool, } impl Lobby { diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index 1d8e735..bfefc32 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,4 +1,5 @@ -// pub mod gamemaster; +pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; +pub mod gameevent; diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index 1c6f6e8..e00957c 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -159,7 +159,7 @@ mod tests { let mut r = _dummy(); r.sync(); let mut sinces = vec![]; - for i in 0..10 { + for _ in 0..10 { sinces.push(r.send("0".to_string()).ok().unwrap()); sinces.push(r.send("0".to_string()).ok().unwrap()); r.sync(); @@ -172,7 +172,7 @@ mod tests { let mut r = _dummy(); r.sync(); let mut sinces = vec![]; - for i in 0..10 { + for _ in 0..10 { sinces.push(r.send("0".to_string()).ok().unwrap()); r.sync(); assert!(r.since == sinces[sinces.len()-1]); diff --git a/secert-hitler/src/model/state/mockrooms.rs b/secert-hitler/src/model/state/mockrooms.rs index 2167441..17d4404 100644 --- a/secert-hitler/src/model/state/mockrooms.rs +++ b/secert-hitler/src/model/state/mockrooms.rs @@ -31,7 +31,7 @@ impl Rooms for MockRooms { r.send(format!(r#"{{ "displayname": "{}", "membership": "join" - }}"#, rands())); + }}"#, rands())).unwrap(); return Ok(Box::new(r)); } } From 4e87d0278f72f3b242ab287ce54630ec67519721 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 11:23:41 -0600 Subject: [PATCH 13/34] move gamemaster to mod.rs cause it seemed ok --- .../src/controller/gamemaster/mod.rs | 118 +++++++++++++++++- 1 file changed, 117 insertions(+), 1 deletion(-) diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index bfefc32..80746c5 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,5 +1,121 @@ -pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; pub mod gameevent; + +use super::super::model::state::room::Room; +use lobby::Lobby; +use gameevent::GameEvent; +use gameevent::GameEventType; +use std::thread; +use std::time; + +pub struct GameMaster { + room: Box, + lobby: Lobby, +} + +impl GameMaster { + fn new(room: Box) -> GameMaster { + GameMaster{ + room: room, + lobby: Lobby::new(), + } + } + + fn run(&mut self) -> Result { + self.run_lobby()?; + self.run_game_setup()?; + self.run_game() + } + + fn run_lobby(&mut self) -> Result { + while !self.lobby.locked { + let rollback = self.room.since(); + let events = self.room.sync(); + for e in &events { + let ge = GameEvent::new(e.body.clone()); + if ge.mode() == GameEventType::GameStart { + self.room.rollback(e.since.clone()); + self.lobby.lock(); + return Ok("ok".to_string()); + } + self.lobby.eat(e.clone()); + } + thread::sleep(time::Duration::new(1, 0)); + } + Ok("ok".to_string()) // todo: on lobby too small, return err and do not lock + } + + fn run_game_setup(&mut self) -> Result { + Err("not impl".to_string()) + } + + fn run_game(&mut self) -> Result { + Err("not impl".to_string()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::super::super::model::state::mockroom::MockRoom; + use super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::model::state::rooms::Rooms; + + #[test] + fn new_mockroom() { + let _ = GameMaster::new(Box::new(MockRoom::create())); + } + + #[test] + fn new_rooms_mockrooms() { + fn get() -> impl Rooms { + let mrs = MockRooms::new(); + mrs + } + let mut mrs = get(); + let r = mrs.create(); + let _ = GameMaster::new(r); + } + + #[test] + fn new_mockrooms() { + let mut mrs = MockRooms::new(); + let r = mrs.create(); + let _ = GameMaster::new(r); + } + + #[test] + fn run_lobby() { + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let room_id = r1.room_id(); + let mut gm = GameMaster::new(r1); + let mut r2 = mrs.join(room_id).unwrap(); + r2.send(format!(r#"{{ + "msgtype": "m.text", + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); // TODO mark end of new players + gm.run_lobby(); // todo assert is_ok + assert!(gm.lobby.players.len() == 2, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + let mut players1 = vec![]; + for k in gm.lobby.players.keys() { + players1.push(k.clone()); + } + gm.run_lobby(); // todo assert is_ok + assert!(gm.lobby.players.len() == 2, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + let players2 = gm.lobby.players.keys(); + assert!(format!("{:?}", players1) == format!("{:?}", players2)); + } + + #[test] + fn run_game_setup_fail() { + assert!(false, "not impl"); + } + + #[test] + fn run_game_fail() { + assert!(false, "not impl"); + } +} From 043075bd490d2f41a3115d62db76b3b8252be341 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 11:24:00 -0600 Subject: [PATCH 14/34] revert cause i like being able to omit things from tests --- .../src/controller/gamemaster/mod.rs | 118 +----------------- 1 file changed, 1 insertion(+), 117 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index 80746c5..bfefc32 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,121 +1,5 @@ +pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; pub mod gameevent; - -use super::super::model::state::room::Room; -use lobby::Lobby; -use gameevent::GameEvent; -use gameevent::GameEventType; -use std::thread; -use std::time; - -pub struct GameMaster { - room: Box, - lobby: Lobby, -} - -impl GameMaster { - fn new(room: Box) -> GameMaster { - GameMaster{ - room: room, - lobby: Lobby::new(), - } - } - - fn run(&mut self) -> Result { - self.run_lobby()?; - self.run_game_setup()?; - self.run_game() - } - - fn run_lobby(&mut self) -> Result { - while !self.lobby.locked { - let rollback = self.room.since(); - let events = self.room.sync(); - for e in &events { - let ge = GameEvent::new(e.body.clone()); - if ge.mode() == GameEventType::GameStart { - self.room.rollback(e.since.clone()); - self.lobby.lock(); - return Ok("ok".to_string()); - } - self.lobby.eat(e.clone()); - } - thread::sleep(time::Duration::new(1, 0)); - } - Ok("ok".to_string()) // todo: on lobby too small, return err and do not lock - } - - fn run_game_setup(&mut self) -> Result { - Err("not impl".to_string()) - } - - fn run_game(&mut self) -> Result { - Err("not impl".to_string()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use super::super::super::model::state::mockroom::MockRoom; - use super::super::super::model::state::mockrooms::MockRooms; - use super::super::super::model::state::rooms::Rooms; - - #[test] - fn new_mockroom() { - let _ = GameMaster::new(Box::new(MockRoom::create())); - } - - #[test] - fn new_rooms_mockrooms() { - fn get() -> impl Rooms { - let mrs = MockRooms::new(); - mrs - } - let mut mrs = get(); - let r = mrs.create(); - let _ = GameMaster::new(r); - } - - #[test] - fn new_mockrooms() { - let mut mrs = MockRooms::new(); - let r = mrs.create(); - let _ = GameMaster::new(r); - } - - #[test] - fn run_lobby() { - let mut mrs = MockRooms::new(); - let r1 = mrs.create(); - let room_id = r1.room_id(); - let mut gm = GameMaster::new(r1); - let mut r2 = mrs.join(room_id).unwrap(); - r2.send(format!(r#"{{ - "msgtype": "m.text", - "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); // TODO mark end of new players - gm.run_lobby(); // todo assert is_ok - assert!(gm.lobby.players.len() == 2, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); - let mut players1 = vec![]; - for k in gm.lobby.players.keys() { - players1.push(k.clone()); - } - gm.run_lobby(); // todo assert is_ok - assert!(gm.lobby.players.len() == 2, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); - let players2 = gm.lobby.players.keys(); - assert!(format!("{:?}", players1) == format!("{:?}", players2)); - } - - #[test] - fn run_game_setup_fail() { - assert!(false, "not impl"); - } - - #[test] - fn run_game_fail() { - assert!(false, "not impl"); - } -} From d3b6ad9feb54bdacd10962f68dc3522b291dc02c Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 11:35:32 -0600 Subject: [PATCH 15/34] impl config::min players for lobby --- secert-hitler/src/config.rs | 1 + .../src/controller/gamemaster/gamemaster.rs | 28 ++++++++++--------- .../src/controller/gamemaster/lobby.rs | 12 ++++++++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/secert-hitler/src/config.rs b/secert-hitler/src/config.rs index e993cd0..9354b85 100644 --- a/secert-hitler/src/config.rs +++ b/secert-hitler/src/config.rs @@ -1 +1,2 @@ pub static PORT:&str = ":8080"; +pub static MIN_PLAYERS:usize = 5; diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 7d214fa..2a1b5b0 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -24,7 +24,7 @@ impl GameMaster { self.run_game() } - fn run_lobby(&mut self) -> Result { + fn run_lobby(&mut self) -> Result { while !self.lobby.locked { let rollback = self.room.since(); let events = self.room.sync(); @@ -33,16 +33,15 @@ impl GameMaster { let ge = GameEvent::new(e.body.clone()); println!(" ge.mode = {:?}", ge.mode()); if ge.mode() == GameEventType::GameStart { - println!(" should return"); self.room.rollback(e.since.clone()); self.lobby.lock(); - return Ok("ok".to_string()); + return self.lobby.ready(); } self.lobby.eat(e.clone()); } thread::sleep(time::Duration::new(1, 0)); } - Ok("ok".to_string()) // todo: on lobby too small, return err and do not lock + return self.lobby.ready(); } fn run_game_setup(&mut self) -> Result { @@ -90,19 +89,22 @@ mod tests { let r1 = mrs.create(); let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); - let mut r2 = mrs.join(room_id).unwrap(); - r2.send(format!(r#"{{ - "msgtype": "m.text", - "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); // TODO mark end of new players - gm.run_lobby(); // todo assert is_ok - assert!(gm.lobby.players.len() == 2, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + for i in 0..4 { + let mut r2 = mrs.join(room_id.clone()).unwrap(); + r2.send(format!(r#"{{ + "msgtype": "m.text", + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); + let ready = gm.run_lobby(); + assert!(ready.is_err() == (i != 3), "want {:?} for ready.is_err #{:?}, which is {:?}", i != 3, i, ready.is_err()); + } + assert!(gm.lobby.players.len() == 5, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); let mut players1 = vec![]; for k in gm.lobby.players.keys() { players1.push(k.clone()); } - gm.run_lobby(); // todo assert is_ok - assert!(gm.lobby.players.len() == 2, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + assert!(gm.run_lobby().is_ok()); + assert!(gm.lobby.players.len() == 5, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); let players2 = gm.lobby.players.keys(); assert!(format!("{:?}", players1) == format!("{:?}", players2)); } diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs index 73e7b70..1f9310a 100644 --- a/secert-hitler/src/controller/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -1,5 +1,6 @@ use super::player::Player; use super::super::super::model::state::event::Event; +use super::super::super::config; use std::collections::HashMap; @@ -29,8 +30,19 @@ impl Lobby { } pub fn lock(&mut self) { + if self.ready().is_err() { + return; + } self.locked = true; } + + pub fn ready(&self) -> Result { + let n: usize = self.players.len(); + if n < config::MIN_PLAYERS { + return Err("not enough players"); + } + Ok(n) + } } #[cfg(test)] From 011826762f51b8321dfd3a09b961b3a68eda5b29 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 13:43:38 -0600 Subject: [PATCH 16/34] Impl game event type build --- secert-hitler/Cargo.lock | 141 ++++++++++++++++++ secert-hitler/Cargo.toml | 2 + .../src/controller/gamemaster/gameevent.rs | 41 +++++ .../src/controller/gamemaster/gamemaster.rs | 24 ++- secert-hitler/src/main.rs | 16 +- 5 files changed, 218 insertions(+), 6 deletions(-) diff --git a/secert-hitler/Cargo.lock b/secert-hitler/Cargo.lock index c637209..894de54 100644 --- a/secert-hitler/Cargo.lock +++ b/secert-hitler/Cargo.lock @@ -1,5 +1,25 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.0.0" @@ -33,6 +53,19 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "getrandom" version = "0.1.14" @@ -44,6 +77,24 @@ dependencies = [ "wasi", ] +[[package]] +name = "hermit-abi" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61565ff7aaace3525556587bd2dc31d4a07071957be715e63ce7b1eccf51a8f4" +dependencies = [ + "libc", +] + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + [[package]] name = "json" version = "0.12.4" @@ -62,18 +113,39 @@ version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + [[package]] name = "ppv-lite86" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "rand" version = "0.7.3" @@ -115,17 +187,86 @@ dependencies = [ "rand_core", ] +[[package]] +name = "regex" +version = "1.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" + [[package]] name = "secert-hitler" version = "0.1.0" dependencies = [ "crossbeam-channel", + "env_logger", "json", + "log", "rand", ] +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/secert-hitler/Cargo.toml b/secert-hitler/Cargo.toml index c115ed5..21c5852 100644 --- a/secert-hitler/Cargo.toml +++ b/secert-hitler/Cargo.toml @@ -10,3 +10,5 @@ edition = "2018" rand = "*" crossbeam-channel = "*" json = "*" +env_logger = "*" +log = "*" diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index d51c43b..54bdc90 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -44,6 +44,23 @@ impl GameEventType { _ => return GameEventType::Null, } } + + fn build(&self) -> GameEvent { + let mut d = json::object!{ + GameEventType: format!("{:?}", self), + sources: [], + targets: [], + params: [], + }; + match self { + _ => {}, + }; + let s = d.dump(); + let d = json::object!{ + "body": s, + }; + GameEvent::new(d.dump()) + } } impl GameEvent { @@ -136,6 +153,30 @@ mod tests { assert!(GameEventType::from_string("GameStop".to_string()) == GameEventType::GameStop); } + #[test] + fn type_build() { + let cases = vec![ + GameEventType::Null, + GameEventType::GameStart, + GameEventType::RoleSet, + GameEventType::ElectionPend, + GameEventType::ElectionSet, + GameEventType::VoteSet, + GameEventType::CardPend, + GameEventType::CardPick, + GameEventType::PolicySet, + GameEventType::SpecialInspect, + GameEventType::SpecialSelect, + GameEventType::SpecialKill, + GameEventType::SpecialPeek, + GameEventType::GameStop, + ]; + for c in &cases { + let gameevent = c.build(); + assert!(*c == gameevent.mode(), "{:?}.build() yielded {:?}", c, gameevent); + } + } + #[test] fn sources() { let ge = GameEvent::new(r#"{"body": "{\"sources\": [\"a\", \"b\"]}"}"#.to_string()); diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 2a1b5b0..178e329 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -2,8 +2,10 @@ use super::super::super::model::state::room::Room; use super::lobby::Lobby; use super::gameevent::GameEvent; use super::gameevent::GameEventType; + use std::thread; use std::time; +use log::{info, warn, error, debug}; pub struct GameMaster { room: Box, @@ -11,15 +13,21 @@ pub struct GameMaster { } impl GameMaster { - fn new(room: Box) -> GameMaster { + pub fn new(room: Box) -> GameMaster { + info!("created for room {}", room.room_id()); GameMaster{ room: room, lobby: Lobby::new(), } } - fn run(&mut self) -> Result { - self.run_lobby()?; + pub fn run(&mut self) -> Result { + loop { + let r = self.run_lobby(); + if r.is_ok() { + break + } + } self.run_game_setup()?; self.run_game() } @@ -28,10 +36,8 @@ impl GameMaster { while !self.lobby.locked { let rollback = self.room.since(); let events = self.room.sync(); - println!("top of loop: since={:?}, events={:?}", self.room.since(), events); for e in &events { let ge = GameEvent::new(e.body.clone()); - println!(" ge.mode = {:?}", ge.mode()); if ge.mode() == GameEventType::GameStart { self.room.rollback(e.since.clone()); self.lobby.lock(); @@ -60,6 +66,13 @@ mod tests { use super::super::super::super::model::state::mockrooms::MockRooms; use super::super::super::super::model::state::rooms::Rooms; + fn init() { + use env_logger::Env; + let _ = env_logger::builder() + .is_test(true) + .try_init(); + } + #[test] fn new_mockroom() { let _ = GameMaster::new(Box::new(MockRoom::create())); @@ -85,6 +98,7 @@ mod tests { #[test] fn run_lobby() { + init(); let mut mrs = MockRooms::new(); let r1 = mrs.create(); let room_id = r1.room_id(); diff --git a/secert-hitler/src/main.rs b/secert-hitler/src/main.rs index e7ce932..f40b451 100644 --- a/secert-hitler/src/main.rs +++ b/secert-hitler/src/main.rs @@ -3,6 +3,20 @@ mod controller; mod model; mod view; +use self::model::state::rooms::Rooms; + +#[macro_use] extern crate log; +use env_logger::Env; + fn main() { - println!("{}", config::PORT); + env_logger::init(); + println!("{}", config::PORT); + let mut rooms = get_rooms(); + let room = rooms.create(); + let mut gamemaster = controller::gamemaster::gamemaster::GameMaster::new(room); + let _ = gamemaster; +} + +fn get_rooms() -> impl Rooms { + model::state::mockrooms::MockRooms::new() } From 6ac68214cec7cc60bbde59878d02d326cc6722f2 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 13:45:06 -0600 Subject: [PATCH 17/34] Impl game event type build --- .../src/controller/gamemaster/gameevent.rs | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 54bdc90..e460fa7 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -26,23 +26,28 @@ pub enum GameEventType { impl GameEventType { fn from_string(s: String) -> GameEventType { - match s.as_ref() { - "Null" => return GameEventType::Null, - "GameStart" => return GameEventType::GameStart, - "RoleSet" => return GameEventType::RoleSet, - "ElectionPend" => return GameEventType::ElectionPend, - "ElectionSet" => return GameEventType::ElectionSet, - "VoteSet" => return GameEventType::VoteSet, - "CardPend" => return GameEventType::CardPend, - "CardPick" => return GameEventType::CardPick, - "PolicySet" => return GameEventType::PolicySet, - "SpecialInspect" => return GameEventType::SpecialInspect, - "SpecialSelect" => return GameEventType::SpecialSelect, - "SpecialKill" => return GameEventType::SpecialKill, - "SpecialPeek" => return GameEventType::SpecialPeek, - "GameStop" => return GameEventType::GameStop, - _ => return GameEventType::Null, + let cases = vec![ + GameEventType::Null, + GameEventType::GameStart, + GameEventType::RoleSet, + GameEventType::ElectionPend, + GameEventType::ElectionSet, + GameEventType::VoteSet, + GameEventType::CardPend, + GameEventType::CardPick, + GameEventType::PolicySet, + GameEventType::SpecialInspect, + GameEventType::SpecialSelect, + GameEventType::SpecialKill, + GameEventType::SpecialPeek, + GameEventType::GameStop, + ]; + for c in &cases { + if format!("{:?}", c) == s { + return *c; + } } + GameEventType::Null } fn build(&self) -> GameEvent { From 1a969185240658d850f3b5b455048af0610254bc Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 13:46:36 -0600 Subject: [PATCH 18/34] Change fromstring to be from string --- secert-hitler/src/controller/gamemaster/gameevent.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index e460fa7..65a88d5 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -6,7 +6,7 @@ pub struct GameEvent { d: json::JsonValue, } -#[derive(PartialEq, Eq, Debug)] +#[derive(PartialEq, Eq, Debug, Clone)] pub enum GameEventType { Null, GameStart, @@ -44,7 +44,7 @@ impl GameEventType { ]; for c in &cases { if format!("{:?}", c) == s { - return *c; + return c.clone(); } } GameEventType::Null From 580d904319b192ce102294a1fb1843ad121e4b17 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 13:48:15 -0600 Subject: [PATCH 19/34] Change fromstring to be from string --- secert-hitler/src/controller/gamemaster/gameevent.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 65a88d5..69f3351 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -184,7 +184,10 @@ mod tests { #[test] fn sources() { - let ge = GameEvent::new(r#"{"body": "{\"sources\": [\"a\", \"b\"]}"}"#.to_string()); + let d = json::object!{ + "sources": ["a", "b"], + }; + let ge = GameEvent::new(d.dump()); assert!(ge.sources() == vec!["a", "b"]); } From 719d197071b037772a98f9eca582d3877d31b235 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 14:34:59 -0600 Subject: [PATCH 20/34] Remove old stpuid roles --- .../src/controller/gamemaster/gameevent.rs | 67 +++++++++++-------- .../src/controller/gamemaster/gamemaster.rs | 67 ++++++++++++++----- .../src/controller/gamemaster/mod.rs | 2 +- .../src/controller/gamemaster/player.rs | 10 ++- .../src/controller/gamemaster/role.rs | 43 +++++------- secert-hitler/src/main.rs | 7 +- 6 files changed, 122 insertions(+), 74 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 69f3351..27625dc 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -4,6 +4,7 @@ use json; #[derive(Clone, Debug)] pub struct GameEvent { d: json::JsonValue, + sender: String, } #[derive(PartialEq, Eq, Debug, Clone)] @@ -51,35 +52,31 @@ impl GameEventType { } fn build(&self) -> GameEvent { - let mut d = json::object!{ - GameEventType: format!("{:?}", self), - sources: [], - targets: [], - params: [], - }; - match self { - _ => {}, - }; - let s = d.dump(); let d = json::object!{ - "body": s, + "body": json::object!{ + GameEventType: format!("{:?}", self), + sources: [], + targets: [], + params: [], + }.dump(), }; - GameEvent::new(d.dump()) + GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}) } } impl GameEvent { - pub fn new(body: String) -> GameEvent { - let top_level = json::parse(&body); + pub fn new(event: Event) -> GameEvent { + let top_level = json::parse(&event.body.clone()); if top_level.is_err() { - return GameEvent{d: json::Null}; + return GameEvent{d: json::Null, sender: event.sender.clone()}; } let top_level = top_level.unwrap(); if !top_level["body"].is_string() { - return GameEvent{d: json::Null}; + return GameEvent{d: json::Null, sender: event.sender.clone()}; } GameEvent{ d: json::parse(&top_level["body"].as_str().unwrap()).unwrap_or(json::Null), + sender: event.sender.clone(), } } @@ -132,10 +129,10 @@ mod tests { #[test] fn new() { - let ge = GameEvent::new("\"a\"".to_string()); + let ge = GameEvent::new(Event{sender: "".to_string(), body: "\"a\"".to_string(), since: "".to_string()}); assert!(ge.d.is_null()); - let ge = GameEvent::new("a".to_string()); + let ge = GameEvent::new(Event{sender: "".to_string(), body: "a".to_string(), since: "".to_string()}); assert!(ge.d.is_null()); assert!(ge.mode() == GameEventType::Null); } @@ -184,28 +181,42 @@ mod tests { #[test] fn sources() { - let d = json::object!{ - "sources": ["a", "b"], - }; - let ge = GameEvent::new(d.dump()); + let d = json::object!{"body": json::object!{"sources": ["a", "b"]}.dump()}; + let ge = GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}); assert!(ge.sources() == vec!["a", "b"]); + assert!(ge.params().len() == 0); + assert!(ge.targets().len() == 0); } #[test] fn targets() { - let ge = GameEvent::new(r#"{"body": "{\"targets\": [\"a\", \"b\"]}"}"#.to_string()); + let d = json::object!{"body": json::object!{"targets": ["a", "b"]}.dump()}; + let ge = GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}); assert!(ge.targets() == vec!["a", "b"]); + assert!(ge.params().len() == 0); + assert!(ge.sources().len() == 0); } #[test] fn params() { - let ge = GameEvent::new(r#"{"body": "{\"params\": [\"a\", \"b\"]}"}"#.to_string()); + let empty: Vec = vec![]; + + let d = json::object!{"body": json::object!{"params": ["a", "b"]}.dump()}; + let ge = GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}); assert!(ge.params() == vec!["a", "b"]); + assert!(ge.targets().len() == 0); + assert!(ge.sources().len() == 0); - let ge = GameEvent::new(r#"{"body": "{\"params\": []}"}"#.to_string()); - assert!(ge.params().len() == 0); + let d = json::object!{"body": json::object!{"params": []}.dump()}; + let ge = GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}); + assert!(ge.params() == empty); + assert!(ge.targets().len() == 0); + assert!(ge.sources().len() == 0); - let ge = GameEvent::new(r#"{"body": "{}"}"#.to_string()); - assert!(ge.params().len() == 0); + let d = json::object!{"body": json::object!{}.dump()}; + let ge = GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}); + assert!(ge.params() == empty); + assert!(ge.targets().len() == 0); + assert!(ge.sources().len() == 0); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index 178e329..e5b052a 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -1,11 +1,12 @@ use super::super::super::model::state::room::Room; use super::lobby::Lobby; +use super::player::Player; use super::gameevent::GameEvent; use super::gameevent::GameEventType; use std::thread; use std::time; -use log::{info, warn, error, debug}; +use log::{info, debug, LevelFilter}; pub struct GameMaster { room: Box, @@ -33,30 +34,61 @@ impl GameMaster { } fn run_lobby(&mut self) -> Result { + self.run_lobby_loop()?; + self.lobby.ready() + } + + fn run_lobby_loop(&mut self) -> Result { while !self.lobby.locked { - let rollback = self.room.since(); - let events = self.room.sync(); - for e in &events { - let ge = GameEvent::new(e.body.clone()); - if ge.mode() == GameEventType::GameStart { - self.room.rollback(e.since.clone()); - self.lobby.lock(); - return self.lobby.ready(); - } - self.lobby.eat(e.clone()); - } + self.run_lobby_scrape()?; thread::sleep(time::Duration::new(1, 0)); } - return self.lobby.ready(); + Ok(0) + } + + fn run_lobby_scrape(&mut self) -> Result { + /* + let rollback = self.room.since(); + let events = self.room.sync(); + for e in &events { + let ge = GameEvent::new(e.body.clone()); + if ge.mode() == GameEventType::GameStart { + self.room.rollback(e.since.clone()); + self.lobby.lock(); + return self.lobby.ready(); + } + self.lobby.eat(e.clone()); + } + */ + Ok(0) } fn run_game_setup(&mut self) -> Result { + for player in self.players() { + if self.player(player.clone()).is_none() { + return Err(format!("missing player {}", player)); + } + debug!("player = {}", player); + } + debug!("/players"); Err("not impl".to_string()) } fn run_game(&mut self) -> Result { Err("not impl".to_string()) } + + fn players(&self) -> Vec { + let mut players = vec![]; + for k in self.lobby.players.keys() { + players.push(k.clone()); + } + players + } + + fn player(&mut self, id: String) -> Option<&mut Player> { + self.lobby.players.get_mut(&id) + } } #[cfg(test)] @@ -67,9 +99,9 @@ mod tests { use super::super::super::super::model::state::rooms::Rooms; fn init() { - use env_logger::Env; let _ = env_logger::builder() .is_test(true) + .filter_level(LevelFilter::Trace) .try_init(); } @@ -125,7 +157,12 @@ mod tests { #[test] fn run_game_setup_fail() { - assert!(false, "not impl"); + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let room_id = r1.room_id(); + let mut gm = GameMaster::new(r1); + assert!(gm.run_game_setup().is_ok()); } #[test] diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index bfefc32..b8a1bfc 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,4 +1,4 @@ -pub mod gamemaster; +//pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; diff --git a/secert-hitler/src/controller/gamemaster/player.rs b/secert-hitler/src/controller/gamemaster/player.rs index d1ccacd..bbb0b15 100644 --- a/secert-hitler/src/controller/gamemaster/player.rs +++ b/secert-hitler/src/controller/gamemaster/player.rs @@ -1,5 +1,4 @@ use super::role::Role; -use super::role::Roles; #[derive(Clone, Debug)] pub struct Player { @@ -15,7 +14,7 @@ impl Player { } } - fn set_role(&mut self, role: Roles) { + pub fn set_role(&mut self, role: Role) { self.role.set(role); } } @@ -28,4 +27,11 @@ mod tests { fn new_player() { let _ = Player::new("id".to_string()); } + + #[test] + fn set_role() { + let mut p = Player::new("id".to_string()); + p.set_role(Role::Facist); + assert!(p.role == Role::Facist); + } } diff --git a/secert-hitler/src/controller/gamemaster/role.rs b/secert-hitler/src/controller/gamemaster/role.rs index 9077e2f..6d3a608 100644 --- a/secert-hitler/src/controller/gamemaster/role.rs +++ b/secert-hitler/src/controller/gamemaster/role.rs @@ -1,10 +1,5 @@ -#[derive(Clone, Debug)] -pub struct Role { - role: Roles, -} - #[derive(Clone, Debug, PartialEq, Eq)] -pub enum Roles { +pub enum Role { Null, Facist, Hitler, @@ -13,25 +8,23 @@ pub enum Roles { impl Role { pub fn new() -> Role { - Role { - role: Roles::Null, - } + Role::Null } - pub fn set(&mut self, role: Roles) { - self.role = role + pub fn set(&mut self, role: Role) { + *self = role.clone() } pub fn is_hitler(&self) -> bool { - self.role == Roles::Hitler + self == &Role::Hitler } pub fn is_facist(&self) -> bool { - self.role == Roles::Facist || self.is_hitler() + self == &Role::Facist || self.is_hitler() } pub fn is_liberal(&self) -> bool { - self.role == Roles::Liberal + self == &Role::Liberal } } @@ -47,70 +40,70 @@ mod tests { #[test] fn set() { let mut r = Role::new(); - r.set(Roles::Facist); - assert!(r.role == Roles::Facist); + r.set(Role::Facist); + assert!(r == Role::Facist); } #[test] fn is_hitler_liberal() { let mut r = Role::new(); - r.set(Roles::Liberal); + r.set(Role::Liberal); assert!(!r.is_hitler()); } #[test] fn is_hitler_facist() { let mut r = Role::new(); - r.set(Roles::Facist); + r.set(Role::Facist); assert!(!r.is_hitler()); } #[test] fn is_hitler_yes() { let mut r = Role::new(); - r.set(Roles::Hitler); + r.set(Role::Hitler); assert!(r.is_hitler()); } #[test] fn is_facist_liberal() { let mut r = Role::new(); - r.set(Roles::Liberal); + r.set(Role::Liberal); assert!(!r.is_facist()); } #[test] fn is_facist_facist() { let mut r = Role::new(); - r.set(Roles::Facist); + r.set(Role::Facist); assert!(r.is_facist()); } #[test] fn is_facist_hitler() { let mut r = Role::new(); - r.set(Roles::Hitler); + r.set(Role::Hitler); assert!(r.is_facist()); } #[test] fn is_liberal_liberal() { let mut r = Role::new(); - r.set(Roles::Liberal); + r.set(Role::Liberal); assert!(r.is_liberal()); } #[test] fn is_liberal_facist() { let mut r = Role::new(); - r.set(Roles::Facist); + r.set(Role::Facist); assert!(!r.is_liberal()); } #[test] fn is_liberal_hitler() { let mut r = Role::new(); - r.set(Roles::Hitler); + r.set(Role::Hitler); assert!(!r.is_liberal()); } } diff --git a/secert-hitler/src/main.rs b/secert-hitler/src/main.rs index f40b451..25cf3de 100644 --- a/secert-hitler/src/main.rs +++ b/secert-hitler/src/main.rs @@ -3,14 +3,14 @@ mod controller; mod model; mod view; -use self::model::state::rooms::Rooms; -#[macro_use] extern crate log; -use env_logger::Env; +use env_logger; fn main() { env_logger::init(); println!("{}", config::PORT); + /* +use self::model::state::rooms::Rooms; let mut rooms = get_rooms(); let room = rooms.create(); let mut gamemaster = controller::gamemaster::gamemaster::GameMaster::new(room); @@ -19,4 +19,5 @@ fn main() { fn get_rooms() -> impl Rooms { model::state::mockrooms::MockRooms::new() + */ } From c1160d9d7e303f1bb41a1cc195654f52d30e765c Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 3 May 2020 15:13:37 -0600 Subject: [PATCH 21/34] i hate borrow --- .../src/controller/gamemaster/gamemaster.rs | 34 +++++++++++-------- .../src/controller/gamemaster/lobby.rs | 5 +-- .../src/controller/gamemaster/mod.rs | 2 +- secert-hitler/src/model/state/mockroom.rs | 8 ++--- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index e5b052a..dcc92cb 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -33,25 +33,27 @@ impl GameMaster { self.run_game() } - fn run_lobby(&mut self) -> Result { - self.run_lobby_loop()?; - self.lobby.ready() - } - - fn run_lobby_loop(&mut self) -> Result { - while !self.lobby.locked { - self.run_lobby_scrape()?; + fn run_lobby(&mut self) -> Result { + let mut r = self.run_lobby_scrape(); + while r.unwrap_or(0) == 0 { + //while r.is_ok() && r.unwrap() == 0 { thread::sleep(time::Duration::new(1, 0)); + r = self.run_lobby_scrape(); } - Ok(0) + return Ok(r.unwrap().clone()); + /* + if r.is_ok() { + return Ok(r.unwrap()); + } + let e = r.err(); + Err(e.unwrap()) + */ } - fn run_lobby_scrape(&mut self) -> Result { - /* - let rollback = self.room.since(); + fn run_lobby_scrape(&mut self) -> Result { let events = self.room.sync(); for e in &events { - let ge = GameEvent::new(e.body.clone()); + let ge = GameEvent::new(e.clone()); if ge.mode() == GameEventType::GameStart { self.room.rollback(e.since.clone()); self.lobby.lock(); @@ -59,7 +61,6 @@ impl GameMaster { } self.lobby.eat(e.clone()); } - */ Ok(0) } @@ -131,11 +132,15 @@ mod tests { #[test] fn run_lobby() { init(); + println!("run_lobby 1"); let mut mrs = MockRooms::new(); let r1 = mrs.create(); + println!("run_lobby 2"); let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); + println!("run_lobby 3"); for i in 0..4 { + println!("run_lobby attempt stop #{}", i); let mut r2 = mrs.join(room_id.clone()).unwrap(); r2.send(format!(r#"{{ "msgtype": "m.text", @@ -160,7 +165,6 @@ mod tests { init(); let mut mrs = MockRooms::new(); let r1 = mrs.create(); - let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); assert!(gm.run_game_setup().is_ok()); } diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs index 1f9310a..296b5a4 100644 --- a/secert-hitler/src/controller/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -4,6 +4,7 @@ use super::super::super::config; use std::collections::HashMap; +#[derive(Clone, Debug)] pub struct Lobby { pub players: HashMap, pub locked: bool, @@ -36,10 +37,10 @@ impl Lobby { self.locked = true; } - pub fn ready(&self) -> Result { + pub fn ready(&self) -> Result { let n: usize = self.players.len(); if n < config::MIN_PLAYERS { - return Err("not enough players"); + return Err("not enough players".to_string()); } Ok(n) } diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index b8a1bfc..bfefc32 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -1,4 +1,4 @@ -//pub mod gamemaster; +pub mod gamemaster; pub mod player; pub mod role; pub mod lobby; diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index e00957c..43adeeb 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -163,7 +163,7 @@ mod tests { sinces.push(r.send("0".to_string()).ok().unwrap()); sinces.push(r.send("0".to_string()).ok().unwrap()); r.sync(); - assert!(r.since == sinces[sinces.len()-1]); + assert!(r.since == *sinces.last().unwrap()); } } @@ -175,7 +175,7 @@ mod tests { for _ in 0..10 { sinces.push(r.send("0".to_string()).ok().unwrap()); r.sync(); - assert!(r.since == sinces[sinces.len()-1]); + assert!(r.since == *sinces.last().unwrap()); } } @@ -186,9 +186,9 @@ mod tests { let mut sinces = vec![]; sinces.push(r.send("0".to_string()).ok().unwrap()); assert!(r.sync().len() == 1); - assert!(r.since == sinces[sinces.len()-1], "after one send: want {:?}, got {:?}: {:?}", sinces[sinces.len()-1], r.since, sinces); + assert!(r.since == *sinces.last().unwrap(), "after one send: want {:?}, got {:?}: {:?}", *sinces.last().unwrap(), r.since, sinces); assert!(r.sync().len() == 0); - assert!(r.since == sinces[sinces.len()-1], "after no send: want {:?}, got {:?}: {:?}", sinces[sinces.len()-1], r.since, sinces); + assert!(r.since == *sinces.last().unwrap(), "after no send: want {:?}, got {:?}: {:?}", *sinces.last().unwrap(), r.since, sinces); } #[test] From d6e18aa5920c7e95aa953eb89339294cfd94c251 Mon Sep 17 00:00:00 2001 From: bel Date: Tue, 5 May 2020 20:22:56 -0600 Subject: [PATCH 22/34] make a shuffle and rand usize8 --- .../src/controller/gamemaster/gamemaster.rs | 93 ++++++++++++++----- 1 file changed, 72 insertions(+), 21 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index dcc92cb..d902893 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -1,4 +1,5 @@ use super::super::super::model::state::room::Room; +use super::super::super::config; use super::lobby::Lobby; use super::player::Player; use super::gameevent::GameEvent; @@ -6,11 +7,13 @@ use super::gameevent::GameEventType; use std::thread; use std::time; -use log::{info, debug, LevelFilter}; +use log::{info, debug, error, LevelFilter}; +use rand::{self, Rng}; pub struct GameMaster { room: Box, lobby: Lobby, + candidate_presidents: Vec, } impl GameMaster { @@ -19,6 +22,7 @@ impl GameMaster { GameMaster{ room: room, lobby: Lobby::new(), + candidate_presidents: vec![], } } @@ -28,32 +32,31 @@ impl GameMaster { if r.is_ok() { break } + error!("error running lobby: {:?}", r); } self.run_game_setup()?; self.run_game() } fn run_lobby(&mut self) -> Result { - let mut r = self.run_lobby_scrape(); - while r.unwrap_or(0) == 0 { - //while r.is_ok() && r.unwrap() == 0 { + loop { + let r = self.run_lobby_scrape().clone(); + if r.clone().is_err() { + return r; + } + if r.clone().unwrap_or(0) != 0 { + return r; + } thread::sleep(time::Duration::new(1, 0)); - r = self.run_lobby_scrape(); } - return Ok(r.unwrap().clone()); - /* - if r.is_ok() { - return Ok(r.unwrap()); - } - let e = r.err(); - Err(e.unwrap()) - */ } fn run_lobby_scrape(&mut self) -> Result { + debug!("run_lobby_scrape:"); let events = self.room.sync(); for e in &events { let ge = GameEvent::new(e.clone()); + debug!("run_lobby_scrape: ge: {:?}", ge); if ge.mode() == GameEventType::GameStart { self.room.rollback(e.since.clone()); self.lobby.lock(); @@ -61,7 +64,7 @@ impl GameMaster { } self.lobby.eat(e.clone()); } - Ok(0) + return self.lobby.ready(); } fn run_game_setup(&mut self) -> Result { @@ -69,9 +72,11 @@ impl GameMaster { if self.player(player.clone()).is_none() { return Err(format!("missing player {}", player)); } + self.candidate_presidents.push(player.clone()); debug!("player = {}", player); } debug!("/players"); + debug!("should shuffle candidate_presidents to set game order"); Err("not impl".to_string()) } @@ -92,12 +97,27 @@ impl GameMaster { } } +fn shuffle(v: &mut Vec) { + for _ in 0..v.len()*2 { + let a = rand_usize(v.len()); + let b = rand_usize(v.len()); + let t: T = v[a].clone(); + v[a] = v[b].clone(); + v[b] = t.clone(); + } +} + +fn rand_usize(n: usize) -> usize { + rand::thread_rng().gen_range(0, n) +} + #[cfg(test)] mod tests { use super::*; use super::super::super::super::model::state::mockroom::MockRoom; use super::super::super::super::model::state::mockrooms::MockRooms; use super::super::super::super::model::state::rooms::Rooms; + use std::collections::HashMap; fn init() { let _ = env_logger::builder() @@ -106,6 +126,34 @@ mod tests { .try_init(); } + #[test] + fn _rand_usize() { + init(); + let mut unique: HashMap = HashMap::new(); + for _ in 0..100 { + unique.insert(rand_usize(100), true); + } + assert!(unique.len() > 1); + } + + #[test] + fn _shuffle() { + init(); + let mut items: Vec = vec![]; + let n: usize = 50; + for i in 0..n { + items.push(i); + } + assert!(items.len() == n); + shuffle(&mut items); + assert!(items.len() == n); + let mut found = false; + for i in 1..items.len() { + found = found || items[i] < items[i-1]; + } + assert!(found); + } + #[test] fn new_mockroom() { let _ = GameMaster::new(Box::new(MockRoom::create())); @@ -132,15 +180,11 @@ mod tests { #[test] fn run_lobby() { init(); - println!("run_lobby 1"); let mut mrs = MockRooms::new(); let r1 = mrs.create(); - println!("run_lobby 2"); let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); - println!("run_lobby 3"); - for i in 0..4 { - println!("run_lobby attempt stop #{}", i); + for i in 0..config::MIN_PLAYERS-1 { let mut r2 = mrs.join(room_id.clone()).unwrap(); r2.send(format!(r#"{{ "msgtype": "m.text", @@ -161,12 +205,19 @@ mod tests { } #[test] - fn run_game_setup_fail() { + fn run_game_setup() { init(); let mut mrs = MockRooms::new(); let r1 = mrs.create(); + let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); - assert!(gm.run_game_setup().is_ok()); + let r = gm.run_game_setup(); + assert!(!r.is_ok()); + for _ in 0..config::MIN_PLAYERS-1 { + mrs.join(room_id.clone()).unwrap(); + } + let r = gm.run_game_setup(); + assert!(r.is_ok(), "failed to start game after sufficient players joined: {:?}", r); } #[test] From 0b4b0723b38c607c1484f5429a3c54a8d98d5a24 Mon Sep 17 00:00:00 2001 From: bel Date: Tue, 5 May 2020 22:00:58 -0600 Subject: [PATCH 23/34] game setup lookin good, need main game loop and win conditions and exceptions tho --- secert-hitler/src/config.rs | 13 ++ .../src/controller/gamemaster/gamemaster.rs | 138 ++++++++++++++++-- .../src/controller/gamemaster/lobby.rs | 3 + .../src/controller/gamemaster/player.rs | 4 + 4 files changed, 145 insertions(+), 13 deletions(-) diff --git a/secert-hitler/src/config.rs b/secert-hitler/src/config.rs index 9354b85..a0330dd 100644 --- a/secert-hitler/src/config.rs +++ b/secert-hitler/src/config.rs @@ -1,2 +1,15 @@ pub static PORT:&str = ":8080"; pub static MIN_PLAYERS:usize = 5; +pub static MAX_PLAYERS:usize = 10; + +pub fn players_to_facists(n: usize) -> Result { + match n { + 5 => Ok(2), + 6 => Ok(2), + 7 => Ok(3), + 8 => Ok(3), + 9 => Ok(4), + 10 => Ok(4), + _ => Err("unsupported number of players".to_string()), + } +} diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs index d902893..b24642f 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster.rs @@ -4,6 +4,7 @@ use super::lobby::Lobby; use super::player::Player; use super::gameevent::GameEvent; use super::gameevent::GameEventType; +use super::role::Role; use std::thread; use std::time; @@ -68,16 +69,13 @@ impl GameMaster { } fn run_game_setup(&mut self) -> Result { - for player in self.players() { - if self.player(player.clone()).is_none() { - return Err(format!("missing player {}", player)); - } - self.candidate_presidents.push(player.clone()); - debug!("player = {}", player); - } - debug!("/players"); - debug!("should shuffle candidate_presidents to set game order"); - Err("not impl".to_string()) + self.setup_gather_candidates()?; + debug!("players: {:?}", self.candidate_presidents); + self.setup_set_roles()?; + debug!("/players: {:?}", self.candidate_presidents); + self.setup_order_candidates()?; + debug!("/players: {:?}", self.candidate_presidents); + Ok("ok".to_string()) } fn run_game(&mut self) -> Result { @@ -95,6 +93,54 @@ impl GameMaster { fn player(&mut self, id: String) -> Option<&mut Player> { self.lobby.players.get_mut(&id) } + + fn setup_gather_candidates(&mut self) -> Result { + for player in self.players() { + let p = self.player(player.clone()); + if p.is_none() { + return Err(format!("missing player {}", player)); + } + self.candidate_presidents.push(player.clone()); + debug!("player = {}", player); + } + Ok("ok".to_string()) + } + + fn setup_set_roles(&mut self) -> Result { + for player in self.players() { + self.player(player.clone()).unwrap().set_role(Role::Liberal); + } + let n = config::players_to_facists(self.players().len())?; + for i in 0..n { + debug!("picking facist {}/{} for {} players", i, n, self.players().len()); + loop { + let j = rand_usize(self.players().len()); + let id = self.candidate_presidents[j].clone(); + let player = self.player(id.clone()).unwrap(); + if player.get_role() != Role::Liberal { + continue; + } + let role = match i { + 0 => Role::Hitler, + _ => Role::Facist, + }; + player.set_role(role); + break; + } + } + Ok("ok".to_string()) + } + + fn setup_order_candidates(&mut self) -> Result { + shuffle(&mut self.candidate_presidents); + let n = self.candidate_presidents.len(); + for _ in 0..5 { + for i in 0..n { + self.candidate_presidents.push(self.candidate_presidents[i].clone()); + } + } + Ok("ok".to_string()) + } } fn shuffle(v: &mut Vec) { @@ -209,19 +255,85 @@ mod tests { init(); let mut mrs = MockRooms::new(); let r1 = mrs.create(); - let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); let r = gm.run_game_setup(); assert!(!r.is_ok()); - for _ in 0..config::MIN_PLAYERS-1 { - mrs.join(room_id.clone()).unwrap(); + for i in 0..config::MIN_PLAYERS { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); } let r = gm.run_game_setup(); assert!(r.is_ok(), "failed to start game after sufficient players joined: {:?}", r); + assert!(gm.candidate_presidents.len() > gm.lobby.players.len()); } #[test] fn run_game_fail() { assert!(false, "not impl"); } + + #[test] + fn setup_gather_candidates() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + assert!(gm.setup_gather_candidates().is_ok()); + for i in 0..config::MIN_PLAYERS { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + } + assert!(gm.setup_gather_candidates().is_ok()); + for i in config::MIN_PLAYERS..config::MAX_PLAYERS+1 { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + } + assert!(gm.setup_gather_candidates().is_ok()); + } + + #[test] + fn setup_set_roles() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + assert!(gm.setup_set_roles().is_err()); + for i in 0..config::MIN_PLAYERS { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + gm.candidate_presidents.push(id.clone()); + } + assert!(gm.setup_set_roles().is_ok()); + for i in config::MIN_PLAYERS..config::MAX_PLAYERS+1 { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + gm.candidate_presidents.push(id.clone()); + } + assert!(gm.setup_set_roles().is_err()); + } + + #[test] + fn setup_order_candidates() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + assert!(gm.setup_order_candidates().is_ok()); + gm.candidate_presidents = ["1".to_string()].to_vec(); + assert!(gm.setup_order_candidates().is_ok()); + assert!(gm.candidate_presidents.len() > 1); + gm.candidate_presidents = [].to_vec(); + for i in 0..50 { + gm.candidate_presidents.push(format!("{}", i)); + } + let was = format!("{:?}", gm.candidate_presidents); + assert!(gm.setup_order_candidates().is_ok()); + assert!(gm.candidate_presidents.len() > 50); + assert!(was != format!("{:?}", gm.candidate_presidents)); + let mut found = false; + for i in 1..gm.candidate_presidents.len() { + found = found || gm.candidate_presidents[i] < gm.candidate_presidents[i-1]; + } + assert!(found); + } } diff --git a/secert-hitler/src/controller/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/lobby.rs index 296b5a4..1b028e0 100644 --- a/secert-hitler/src/controller/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/lobby.rs @@ -42,6 +42,9 @@ impl Lobby { if n < config::MIN_PLAYERS { return Err("not enough players".to_string()); } + if n > config::MAX_PLAYERS { + return Err("too many players".to_string()); + } Ok(n) } } diff --git a/secert-hitler/src/controller/gamemaster/player.rs b/secert-hitler/src/controller/gamemaster/player.rs index bbb0b15..63c8f68 100644 --- a/secert-hitler/src/controller/gamemaster/player.rs +++ b/secert-hitler/src/controller/gamemaster/player.rs @@ -14,6 +14,10 @@ impl Player { } } + pub fn get_role(&self) -> Role { + self.role.clone() + } + pub fn set_role(&mut self, role: Role) { self.role.set(role); } From 2b8581952e8b54dca427dd49ee1977348efdc150 Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 07:28:54 -0600 Subject: [PATCH 24/34] Refacotr to small files dedicated to gamemaster sub ops --- secert-hitler/src/config.rs | 8 + .../src/controller/gamemaster/gameevent.rs | 7 +- .../src/controller/gamemaster/gamemaster.rs | 339 ------------------ .../controller/gamemaster/gamemaster/game.rs | 56 +++ .../gamemaster/gamemaster/gamemaster.rs | 98 +++++ .../controller/gamemaster/gamemaster/lobby.rs | 81 +++++ .../controller/gamemaster/gamemaster/mod.rs | 4 + .../controller/gamemaster/gamemaster/setup.rs | 181 ++++++++++ .../src/controller/gamemaster/mod.rs | 2 + .../src/controller/gamemaster/policy.rs | 37 ++ .../src/controller/gamemaster/rand.rs | 47 +++ 11 files changed, 518 insertions(+), 342 deletions(-) delete mode 100644 secert-hitler/src/controller/gamemaster/gamemaster.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster/game.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster/mod.rs create mode 100644 secert-hitler/src/controller/gamemaster/gamemaster/setup.rs create mode 100644 secert-hitler/src/controller/gamemaster/policy.rs create mode 100644 secert-hitler/src/controller/gamemaster/rand.rs diff --git a/secert-hitler/src/config.rs b/secert-hitler/src/config.rs index a0330dd..a08dabc 100644 --- a/secert-hitler/src/config.rs +++ b/secert-hitler/src/config.rs @@ -13,3 +13,11 @@ pub fn players_to_facists(n: usize) -> Result { _ => Err("unsupported number of players".to_string()), } } + +pub fn players_to_policies_facist(n: usize) -> usize { + 11 - (n-5)/2 +} + +pub fn players_to_policies_liberal(_: usize) -> usize { + 6 +} diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 27625dc..a703ee4 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -15,6 +15,7 @@ pub enum GameEventType { ElectionPend, ElectionSet, VoteSet, + VoteFailed, CardPend, CardPick, PolicySet, @@ -26,7 +27,7 @@ pub enum GameEventType { } impl GameEventType { - fn from_string(s: String) -> GameEventType { + pub fn from_string(s: String) -> GameEventType { let cases = vec![ GameEventType::Null, GameEventType::GameStart, @@ -51,7 +52,7 @@ impl GameEventType { GameEventType::Null } - fn build(&self) -> GameEvent { + pub fn build(&self) -> GameEvent { let d = json::object!{ "body": json::object!{ GameEventType: format!("{:?}", self), @@ -103,7 +104,7 @@ impl GameEvent { self.str_vec("params") } - fn str_vec(&self, key: &str) -> Vec { + pub fn str_vec(&self, key: &str) -> Vec { let mut out = vec![]; if self.d[key].is_string() { out.push(self.d[key].as_str().unwrap().to_string()); diff --git a/secert-hitler/src/controller/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster.rs deleted file mode 100644 index b24642f..0000000 --- a/secert-hitler/src/controller/gamemaster/gamemaster.rs +++ /dev/null @@ -1,339 +0,0 @@ -use super::super::super::model::state::room::Room; -use super::super::super::config; -use super::lobby::Lobby; -use super::player::Player; -use super::gameevent::GameEvent; -use super::gameevent::GameEventType; -use super::role::Role; - -use std::thread; -use std::time; -use log::{info, debug, error, LevelFilter}; -use rand::{self, Rng}; - -pub struct GameMaster { - room: Box, - lobby: Lobby, - candidate_presidents: Vec, -} - -impl GameMaster { - pub fn new(room: Box) -> GameMaster { - info!("created for room {}", room.room_id()); - GameMaster{ - room: room, - lobby: Lobby::new(), - candidate_presidents: vec![], - } - } - - pub fn run(&mut self) -> Result { - loop { - let r = self.run_lobby(); - if r.is_ok() { - break - } - error!("error running lobby: {:?}", r); - } - self.run_game_setup()?; - self.run_game() - } - - fn run_lobby(&mut self) -> Result { - loop { - let r = self.run_lobby_scrape().clone(); - if r.clone().is_err() { - return r; - } - if r.clone().unwrap_or(0) != 0 { - return r; - } - thread::sleep(time::Duration::new(1, 0)); - } - } - - fn run_lobby_scrape(&mut self) -> Result { - debug!("run_lobby_scrape:"); - let events = self.room.sync(); - for e in &events { - let ge = GameEvent::new(e.clone()); - debug!("run_lobby_scrape: ge: {:?}", ge); - if ge.mode() == GameEventType::GameStart { - self.room.rollback(e.since.clone()); - self.lobby.lock(); - return self.lobby.ready(); - } - self.lobby.eat(e.clone()); - } - return self.lobby.ready(); - } - - fn run_game_setup(&mut self) -> Result { - self.setup_gather_candidates()?; - debug!("players: {:?}", self.candidate_presidents); - self.setup_set_roles()?; - debug!("/players: {:?}", self.candidate_presidents); - self.setup_order_candidates()?; - debug!("/players: {:?}", self.candidate_presidents); - Ok("ok".to_string()) - } - - fn run_game(&mut self) -> Result { - Err("not impl".to_string()) - } - - fn players(&self) -> Vec { - let mut players = vec![]; - for k in self.lobby.players.keys() { - players.push(k.clone()); - } - players - } - - fn player(&mut self, id: String) -> Option<&mut Player> { - self.lobby.players.get_mut(&id) - } - - fn setup_gather_candidates(&mut self) -> Result { - for player in self.players() { - let p = self.player(player.clone()); - if p.is_none() { - return Err(format!("missing player {}", player)); - } - self.candidate_presidents.push(player.clone()); - debug!("player = {}", player); - } - Ok("ok".to_string()) - } - - fn setup_set_roles(&mut self) -> Result { - for player in self.players() { - self.player(player.clone()).unwrap().set_role(Role::Liberal); - } - let n = config::players_to_facists(self.players().len())?; - for i in 0..n { - debug!("picking facist {}/{} for {} players", i, n, self.players().len()); - loop { - let j = rand_usize(self.players().len()); - let id = self.candidate_presidents[j].clone(); - let player = self.player(id.clone()).unwrap(); - if player.get_role() != Role::Liberal { - continue; - } - let role = match i { - 0 => Role::Hitler, - _ => Role::Facist, - }; - player.set_role(role); - break; - } - } - Ok("ok".to_string()) - } - - fn setup_order_candidates(&mut self) -> Result { - shuffle(&mut self.candidate_presidents); - let n = self.candidate_presidents.len(); - for _ in 0..5 { - for i in 0..n { - self.candidate_presidents.push(self.candidate_presidents[i].clone()); - } - } - Ok("ok".to_string()) - } -} - -fn shuffle(v: &mut Vec) { - for _ in 0..v.len()*2 { - let a = rand_usize(v.len()); - let b = rand_usize(v.len()); - let t: T = v[a].clone(); - v[a] = v[b].clone(); - v[b] = t.clone(); - } -} - -fn rand_usize(n: usize) -> usize { - rand::thread_rng().gen_range(0, n) -} - -#[cfg(test)] -mod tests { - use super::*; - use super::super::super::super::model::state::mockroom::MockRoom; - use super::super::super::super::model::state::mockrooms::MockRooms; - use super::super::super::super::model::state::rooms::Rooms; - use std::collections::HashMap; - - fn init() { - let _ = env_logger::builder() - .is_test(true) - .filter_level(LevelFilter::Trace) - .try_init(); - } - - #[test] - fn _rand_usize() { - init(); - let mut unique: HashMap = HashMap::new(); - for _ in 0..100 { - unique.insert(rand_usize(100), true); - } - assert!(unique.len() > 1); - } - - #[test] - fn _shuffle() { - init(); - let mut items: Vec = vec![]; - let n: usize = 50; - for i in 0..n { - items.push(i); - } - assert!(items.len() == n); - shuffle(&mut items); - assert!(items.len() == n); - let mut found = false; - for i in 1..items.len() { - found = found || items[i] < items[i-1]; - } - assert!(found); - } - - #[test] - fn new_mockroom() { - let _ = GameMaster::new(Box::new(MockRoom::create())); - } - - #[test] - fn new_rooms_mockrooms() { - fn get() -> impl Rooms { - let mrs = MockRooms::new(); - mrs - } - let mut mrs = get(); - let r = mrs.create(); - let _ = GameMaster::new(r); - } - - #[test] - fn new_mockrooms() { - let mut mrs = MockRooms::new(); - let r = mrs.create(); - let _ = GameMaster::new(r); - } - - #[test] - fn run_lobby() { - init(); - let mut mrs = MockRooms::new(); - let r1 = mrs.create(); - let room_id = r1.room_id(); - let mut gm = GameMaster::new(r1); - for i in 0..config::MIN_PLAYERS-1 { - let mut r2 = mrs.join(room_id.clone()).unwrap(); - r2.send(format!(r#"{{ - "msgtype": "m.text", - "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); - let ready = gm.run_lobby(); - assert!(ready.is_err() == (i != 3), "want {:?} for ready.is_err #{:?}, which is {:?}", i != 3, i, ready.is_err()); - } - assert!(gm.lobby.players.len() == 5, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); - let mut players1 = vec![]; - for k in gm.lobby.players.keys() { - players1.push(k.clone()); - } - assert!(gm.run_lobby().is_ok()); - assert!(gm.lobby.players.len() == 5, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); - let players2 = gm.lobby.players.keys(); - assert!(format!("{:?}", players1) == format!("{:?}", players2)); - } - - #[test] - fn run_game_setup() { - init(); - let mut mrs = MockRooms::new(); - let r1 = mrs.create(); - let mut gm = GameMaster::new(r1); - let r = gm.run_game_setup(); - assert!(!r.is_ok()); - for i in 0..config::MIN_PLAYERS { - let id = format!("{}", i); - gm.lobby.players.insert(id.clone(), Player::new(id.clone())); - } - let r = gm.run_game_setup(); - assert!(r.is_ok(), "failed to start game after sufficient players joined: {:?}", r); - assert!(gm.candidate_presidents.len() > gm.lobby.players.len()); - } - - #[test] - fn run_game_fail() { - assert!(false, "not impl"); - } - - #[test] - fn setup_gather_candidates() { - init(); - let mut mrs = MockRooms::new(); - let r1 = mrs.create(); - let mut gm = GameMaster::new(r1); - assert!(gm.setup_gather_candidates().is_ok()); - for i in 0..config::MIN_PLAYERS { - let id = format!("{}", i); - gm.lobby.players.insert(id.clone(), Player::new(id.clone())); - } - assert!(gm.setup_gather_candidates().is_ok()); - for i in config::MIN_PLAYERS..config::MAX_PLAYERS+1 { - let id = format!("{}", i); - gm.lobby.players.insert(id.clone(), Player::new(id.clone())); - } - assert!(gm.setup_gather_candidates().is_ok()); - } - - #[test] - fn setup_set_roles() { - init(); - let mut mrs = MockRooms::new(); - let r1 = mrs.create(); - let mut gm = GameMaster::new(r1); - assert!(gm.setup_set_roles().is_err()); - for i in 0..config::MIN_PLAYERS { - let id = format!("{}", i); - gm.lobby.players.insert(id.clone(), Player::new(id.clone())); - gm.candidate_presidents.push(id.clone()); - } - assert!(gm.setup_set_roles().is_ok()); - for i in config::MIN_PLAYERS..config::MAX_PLAYERS+1 { - let id = format!("{}", i); - gm.lobby.players.insert(id.clone(), Player::new(id.clone())); - gm.candidate_presidents.push(id.clone()); - } - assert!(gm.setup_set_roles().is_err()); - } - - #[test] - fn setup_order_candidates() { - init(); - let mut mrs = MockRooms::new(); - let r1 = mrs.create(); - let mut gm = GameMaster::new(r1); - assert!(gm.setup_order_candidates().is_ok()); - gm.candidate_presidents = ["1".to_string()].to_vec(); - assert!(gm.setup_order_candidates().is_ok()); - assert!(gm.candidate_presidents.len() > 1); - gm.candidate_presidents = [].to_vec(); - for i in 0..50 { - gm.candidate_presidents.push(format!("{}", i)); - } - let was = format!("{:?}", gm.candidate_presidents); - assert!(gm.setup_order_candidates().is_ok()); - assert!(gm.candidate_presidents.len() > 50); - assert!(was != format!("{:?}", gm.candidate_presidents)); - let mut found = false; - for i in 1..gm.candidate_presidents.len() { - found = found || gm.candidate_presidents[i] < gm.candidate_presidents[i-1]; - } - assert!(found); - } -} diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs new file mode 100644 index 0000000..319ecba --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -0,0 +1,56 @@ +use super::gamemaster::GameMaster; +use super::super::gameevent::GameEvent; +use super::super::policy::Policy; + +use log::{LevelFilter}; + +impl GameMaster { + pub fn game_is_over(&mut self) -> Result { + Err("not impl".to_string()) + } + + pub fn game_election(&mut self) -> Result { + Err("not impl".to_string()) + } + + pub fn game_election_vote(&mut self) -> Result { + Err("not impl".to_string()) + } + + pub fn game_policy_select_random(&mut self) -> Result { + Err("not impl".to_string()) + } + + pub fn game_policy_select(&mut self) -> Result { + Err("not impl".to_string()) + } + + pub fn game_policy_veto(&mut self, _p: Policy) -> Result { + Err("not impl".to_string()) + } + + pub fn game_ends_with(&mut self, _p: Policy) -> Result { + Err("not impl".to_string()) + } + + pub fn game_policy_enact(&mut self, _p: Policy) -> Result { + Err("not impl".to_string()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn init() { + let _ = env_logger::builder() + .is_test(true) + .filter_level(LevelFilter::Trace) + .try_init(); + } + + #[test] + fn game() { + init(); + } +} diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs new file mode 100644 index 0000000..c201dfb --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -0,0 +1,98 @@ +use super::super::super::super::model::state::room::Room; +use super::super::lobby::Lobby; +use super::super::player::Player; +use super::super::policy::Policy; +use super::super::gameevent::GameEventType; + +use log::{info, error}; + +pub struct GameMaster { + pub room: Box, + pub lobby: Lobby, + pub candidate_presidents: Vec, + pub deck: Vec, +} + +impl GameMaster { + + pub fn new(room: Box) -> GameMaster { + info!("created for room {}", room.room_id()); + GameMaster{ + room: room, + lobby: Lobby::new(), + candidate_presidents: vec![], + deck: vec![], + } + } + + pub fn run(&mut self) -> Result { + loop { + let r = self.run_lobby(); + if r.is_ok() { + break + } + error!("error running lobby: {:?}", r); + } + self.run_game_setup()?; + self.run_game() + } + + pub fn run_game(&mut self) -> Result { + loop { + self.game_is_over()?; + self.game_election()?; + self.game_is_over()?; + let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() { + GameEventType::VoteFailed => self.game_policy_select_random(), + GameEventType::GameStop => Err("game ended".to_string()), + _ => self.game_policy_select(), + }?; + self.game_policy_veto(p.clone())?; + self.game_ends_with(p.clone())?; + self.game_policy_enact(p.clone())?; // todo facist policies special + } + } + + pub fn players(&self) -> Vec { + let mut players = vec![]; + for k in self.lobby.players.keys() { + players.push(k.clone()); + } + players + } + + pub fn player(&mut self, id: String) -> Option<&mut Player> { + self.lobby.players.get_mut(&id) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::super::super::super::super::model::state::mockroom::MockRoom; + use super::super::super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::super::super::model::state::rooms::Rooms; + + #[test] + fn new_mockroom() { + let _ = GameMaster::new(Box::new(MockRoom::create())); + } + + #[test] + fn new_rooms_mockrooms() { + fn get() -> impl Rooms { + let mrs = MockRooms::new(); + mrs + } + let mut mrs = get(); + let r = mrs.create(); + let _ = GameMaster::new(r); + } + + #[test] + fn new_mockrooms() { + let mut mrs = MockRooms::new(); + let r = mrs.create(); + let _ = GameMaster::new(r); + } +} diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs new file mode 100644 index 0000000..1cc3ede --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs @@ -0,0 +1,81 @@ +use super::gamemaster::GameMaster; + +use super::super::gameevent::GameEvent; +use super::super::gameevent::GameEventType; + +use std::thread; +use std::time; +use log::{debug, LevelFilter}; + +impl GameMaster { + pub fn run_lobby(&mut self) -> Result { + loop { + let r = self.run_lobby_scrape().clone(); + if r.clone().is_err() { + return r; + } + if r.clone().unwrap_or(0) != 0 { + return r; + } + thread::sleep(time::Duration::new(1, 0)); + } + } + + pub fn run_lobby_scrape(&mut self) -> Result { + debug!("run_lobby_scrape:"); + let events = self.room.sync(); + for e in &events { + let ge = GameEvent::new(e.clone()); + debug!("run_lobby_scrape: ge: {:?}", ge); + if ge.mode() == GameEventType::GameStart { + self.room.rollback(e.since.clone()); + self.lobby.lock(); + return self.lobby.ready(); + } + self.lobby.eat(e.clone()); + } + return self.lobby.ready(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::super::super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::super::super::model::state::rooms::Rooms; + use super::super::super::super::super::config; + + fn init() { + let _ = env_logger::builder() + .is_test(true) + .filter_level(LevelFilter::Trace) + .try_init(); + } + + #[test] + fn run_lobby() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let room_id = r1.room_id(); + let mut gm = GameMaster::new(r1); + for i in 0..config::MIN_PLAYERS-1 { + let mut r2 = mrs.join(room_id.clone()).unwrap(); + r2.send(format!(r#"{{ + "msgtype": "m.text", + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); + let ready = gm.run_lobby(); + assert!(ready.is_err() == (i != 3), "want {:?} for ready.is_err #{:?}, which is {:?}", i != 3, i, ready.is_err()); + } + assert!(gm.lobby.players.len() == 5, "first run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + let mut players1 = vec![]; + for k in gm.lobby.players.keys() { + players1.push(k.clone()); + } + assert!(gm.run_lobby().is_ok()); + assert!(gm.lobby.players.len() == 5, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); + let players2 = gm.lobby.players.keys(); + assert!(format!("{:?}", players1) == format!("{:?}", players2)); + } +} diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/gamemaster/mod.rs new file mode 100644 index 0000000..fa9bfd8 --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster/mod.rs @@ -0,0 +1,4 @@ +pub mod gamemaster; +mod lobby; +mod setup; +mod game; diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs new file mode 100644 index 0000000..45aecbd --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs @@ -0,0 +1,181 @@ +use super::gamemaster::GameMaster; + +use super::super::super::super::config; +use super::super::role::Role; +use super::super::policy::Policy; +use super::super::rand::rand_usize; +use super::super::rand::shuffle; + +use log::{debug, LevelFilter}; + +impl GameMaster { + pub fn run_game_setup(&mut self) -> Result { + self.setup_gather_candidates()?; + debug!("players: {:?}", self.candidate_presidents); + self.setup_set_roles()?; + debug!("/players: {:?}", self.candidate_presidents); + self.setup_order_candidates()?; + debug!("/players: {:?}", self.candidate_presidents); + self.setup_deck()?; + Ok("ok".to_string()) + } + + pub fn setup_gather_candidates(&mut self) -> Result { + for player in self.players() { + let p = self.player(player.clone()); + if p.is_none() { + return Err(format!("missing player {}", player)); + } + self.candidate_presidents.push(player.clone()); + debug!("player = {}", player); + } + Ok("ok".to_string()) + } + + pub fn setup_set_roles(&mut self) -> Result { + for player in self.players() { + self.player(player.clone()).unwrap().set_role(Role::Liberal); + } + let n = config::players_to_facists(self.players().len())?; + for i in 0..n { + debug!("picking facist {}/{} for {} players", i, n, self.players().len()); + loop { + let j = rand_usize(self.players().len()); + let id = self.candidate_presidents[j].clone(); + let player = self.player(id.clone()).unwrap(); + if player.get_role() != Role::Liberal { + continue; + } + let role = match i { + 0 => Role::Hitler, + _ => Role::Facist, + }; + player.set_role(role); + break; + } + } + Ok("ok".to_string()) + } + + pub fn setup_order_candidates(&mut self) -> Result { + shuffle(&mut self.candidate_presidents); + let n = self.candidate_presidents.len(); + for _ in 0..5 { + for i in 0..n { + self.candidate_presidents.push(self.candidate_presidents[i].clone()); + } + } + Ok("ok".to_string()) + } + + pub fn setup_deck(&mut self) -> Result { + for _ in 0..config::players_to_policies_facist(self.players().len()) { + self.deck.push(Policy::Facist); + } + + for _ in 0..config::players_to_policies_liberal(self.players().len()) { + self.deck.push(Policy::Liberal); + } + + shuffle(&mut self.deck); + + Ok("deck is loaded".to_string()) + } +} + +mod tests { + use super::*; + use super::super::super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::super::super::model::state::rooms::Rooms; + use super::super::super::player::Player; + + fn init() { + let _ = env_logger::builder() + .is_test(true) + .filter_level(LevelFilter::Trace) + .try_init(); + } + + #[test] + fn run_game_setup() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + let r = gm.run_game_setup(); + assert!(!r.is_ok()); + for i in 0..config::MIN_PLAYERS { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + } + let r = gm.run_game_setup(); + assert!(r.is_ok(), "failed to start game after sufficient players joined: {:?}", r); + assert!(gm.candidate_presidents.len() > gm.lobby.players.len()); + assert!(gm.deck.len() > 1); + } + + #[test] + fn setup_gather_candidates() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + assert!(gm.setup_gather_candidates().is_ok()); + for i in 0..config::MIN_PLAYERS { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + } + assert!(gm.setup_gather_candidates().is_ok()); + for i in config::MIN_PLAYERS..config::MAX_PLAYERS+1 { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + } + assert!(gm.setup_gather_candidates().is_ok()); + } + + #[test] + fn setup_set_roles() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + assert!(gm.setup_set_roles().is_err()); + for i in 0..config::MIN_PLAYERS { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + gm.candidate_presidents.push(id.clone()); + } + assert!(gm.setup_set_roles().is_ok()); + for i in config::MIN_PLAYERS..config::MAX_PLAYERS+1 { + let id = format!("{}", i); + gm.lobby.players.insert(id.clone(), Player::new(id.clone())); + gm.candidate_presidents.push(id.clone()); + } + assert!(gm.setup_set_roles().is_err()); + } + + #[test] + fn setup_order_candidates() { + init(); + let mut mrs = MockRooms::new(); + let r1 = mrs.create(); + let mut gm = GameMaster::new(r1); + assert!(gm.setup_order_candidates().is_ok()); + gm.candidate_presidents = ["1".to_string()].to_vec(); + assert!(gm.setup_order_candidates().is_ok()); + assert!(gm.candidate_presidents.len() > 1); + gm.candidate_presidents = [].to_vec(); + for i in 0..50 { + gm.candidate_presidents.push(format!("{}", i)); + } + let was = format!("{:?}", gm.candidate_presidents); + assert!(gm.setup_order_candidates().is_ok()); + assert!(gm.candidate_presidents.len() > 50); + assert!(was != format!("{:?}", gm.candidate_presidents)); + let mut found = false; + for i in 1..gm.candidate_presidents.len() { + found = found || gm.candidate_presidents[i] < gm.candidate_presidents[i-1]; + } + assert!(found); + } +} diff --git a/secert-hitler/src/controller/gamemaster/mod.rs b/secert-hitler/src/controller/gamemaster/mod.rs index bfefc32..758a60d 100644 --- a/secert-hitler/src/controller/gamemaster/mod.rs +++ b/secert-hitler/src/controller/gamemaster/mod.rs @@ -3,3 +3,5 @@ pub mod player; pub mod role; pub mod lobby; pub mod gameevent; +pub mod policy; +pub mod rand; diff --git a/secert-hitler/src/controller/gamemaster/policy.rs b/secert-hitler/src/controller/gamemaster/policy.rs new file mode 100644 index 0000000..816c4e5 --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/policy.rs @@ -0,0 +1,37 @@ +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Policy { + Null, + Facist, + Liberal, +} + +impl Policy { + pub fn new() -> Policy { + Policy::Null + } + + pub fn set(&mut self, policy: Policy) { + *self = policy.clone() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new_role() { + let _ = Policy::new(); + } + + #[test] + fn set() { + let mut r = Policy::new(); + r.set(Policy::Facist); + assert!(r == Policy::Facist); + + let mut r = Policy::new(); + r.set(Policy::Liberal); + assert!(r == Policy::Liberal); + } +} diff --git a/secert-hitler/src/controller/gamemaster/rand.rs b/secert-hitler/src/controller/gamemaster/rand.rs new file mode 100644 index 0000000..5821690 --- /dev/null +++ b/secert-hitler/src/controller/gamemaster/rand.rs @@ -0,0 +1,47 @@ +use rand::{self, Rng}; + +pub fn shuffle(v: &mut Vec) { + for _ in 0..v.len()*2 { + let a = rand_usize(v.len()); + let b = rand_usize(v.len()); + let t: T = v[a].clone(); + v[a] = v[b].clone(); + v[b] = t.clone(); + } +} + +pub fn rand_usize(n: usize) -> usize { + rand::thread_rng().gen_range(0, n) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + + #[test] + fn _rand_usize() { + let mut unique: HashMap = HashMap::new(); + for _ in 0..100 { + unique.insert(rand_usize(100), true); + } + assert!(unique.len() > 1); + } + + #[test] + fn _shuffle() { + let mut items: Vec = vec![]; + let n: usize = 50; + for i in 0..n { + items.push(i); + } + assert!(items.len() == n); + shuffle(&mut items); + assert!(items.len() == n); + let mut found = false; + for i in 1..items.len() { + found = found || items[i] < items[i-1]; + } + assert!(found); + } +} From 0347d613dfd9531928db705191aac9c16b10ffc7 Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 08:43:56 -0600 Subject: [PATCH 25/34] impl game over --- .../controller/gamemaster/gamemaster/game.rs | 136 +++++++++++++++--- .../gamemaster/gamemaster/gamemaster.rs | 35 ++++- .../controller/gamemaster/gamemaster/setup.rs | 26 ++-- .../src/controller/gamemaster/policy.rs | 22 ++- secert-hitler/src/model/state/room.rs | 4 +- 5 files changed, 186 insertions(+), 37 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 319ecba..faab016 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -1,46 +1,67 @@ use super::gamemaster::GameMaster; use super::super::gameevent::GameEvent; +use super::super::gameevent::GameEventType; use super::super::policy::Policy; - -use log::{LevelFilter}; +use super::super::role::Role; +use super::super::player::Player; impl GameMaster { - pub fn game_is_over(&mut self) -> Result { - Err("not impl".to_string()) + pub fn game_is_over(&mut self) -> Result { + if self.policies[&Policy::Facist] >= 3 { + let chancellor = self.chancellor.clone(); + if chancellor.is_some() { + let player = self.player(chancellor.unwrap()); + if player.is_some() && player.unwrap().get_role() == Role::Hitler { + return Err(Role::Facist); + } + } + } + if self.policies[&Policy::Facist] > 5 { + return Err(Role::Facist); + } + if self.policies[&Policy::Liberal] > 5 { + return Err(Role::Liberal); + } + Ok(GameEventType::Null.build()) } - pub fn game_election(&mut self) -> Result { - Err("not impl".to_string()) + pub fn game_election(&mut self) -> Result { + Err(Role::Null) } - pub fn game_election_vote(&mut self) -> Result { - Err("not impl".to_string()) + pub fn game_election_vote(&mut self) -> Result { + Err(Role::Null) } - pub fn game_policy_select_random(&mut self) -> Result { - Err("not impl".to_string()) + pub fn game_policy_select_random(&mut self) -> Result { + Err(Role::Null) } - pub fn game_policy_select(&mut self) -> Result { - Err("not impl".to_string()) + pub fn game_policy_select(&mut self) -> Result { + Err(Role::Null) } - pub fn game_policy_veto(&mut self, _p: Policy) -> Result { - Err("not impl".to_string()) + pub fn game_policy_veto(&mut self, _p: Policy) -> Result { + Err(Role::Null) } - pub fn game_ends_with(&mut self, _p: Policy) -> Result { - Err("not impl".to_string()) + pub fn game_ends_with(&mut self, _p: Policy) -> Result { + Err(Role::Null) } - pub fn game_policy_enact(&mut self, _p: Policy) -> Result { - Err("not impl".to_string()) + pub fn game_policy_enact(&mut self, _p: Policy) -> Result { + Err(Role::Null) } } #[cfg(test)] mod tests { use super::*; + use super::super::super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::super::super::model::state::rooms::Rooms; + use super::super::super::super::super::config; + + use log::{debug, LevelFilter}; fn init() { let _ = env_logger::builder() @@ -49,8 +70,83 @@ mod tests { .try_init(); } - #[test] - fn game() { + fn dummy() -> GameMaster { init(); + let mut mrs = MockRooms::new(); + let r = mrs.create(); + let room_id = r.room_id().clone(); + let mut gm = GameMaster::new(r); + for _ in 0..config::MIN_PLAYERS-2 { + assert!(mrs.join(room_id.clone()).is_ok()); + } + mrs.join(room_id).unwrap().send(format!(r#"{{ + "msgtype": "m.text", + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); + assert!(gm.run_lobby().is_ok()); + assert!(gm.run_game_setup().is_ok()); + gm + } + + #[test] + fn test_dummy() { + let gm = dummy(); + assert!(gm.players().len() == config::MIN_PLAYERS); + assert!(config::players_to_policies_facist(gm.players().len()) + config::players_to_policies_liberal(gm.players().len()) == gm.deck.len()); + assert!(gm.players().len() < gm.candidate_presidents.len()); + assert!(gm.policies[&Policy::Facist] == 0); + assert!(gm.policies[&Policy::Liberal] == 0); + let mut found = false; + for i in 1..gm.candidate_presidents.len() { + found = found || gm.candidate_presidents[i-1] > gm.candidate_presidents[i]; + } + assert!(found); + debug!("gamemaster dummy: {:?}", gm); + } + + #[test] + fn game_is_over() { + let mut gm = dummy(); + assert!(gm.game_is_over().is_ok()); + + let mut gm = dummy(); + gm.policies.insert(Policy::Facist, 10); + assert!(gm.game_is_over().is_err()); + assert!(gm.game_is_over().err().unwrap() == Role::Facist); + + let mut gm = dummy(); + gm.policies.insert(Policy::Liberal, 10); + assert!(gm.game_is_over().err().unwrap() == Role::Liberal); + + let mut gm = dummy(); + gm.policies.insert(Policy::Facist, 3); + assert!(gm.game_is_over().is_ok()); + gm.chancellor = Some("123".to_string()); + assert!(gm.game_is_over().is_ok()); + let mut p = Player::new("123".to_string()); + p.set_role(Role::Liberal); + gm.lobby.players.insert("123".to_string(), p); + assert!(gm.game_is_over().is_ok()); + + let mut gm = dummy(); + gm.policies.insert(Policy::Facist, 3); + assert!(gm.game_is_over().is_ok()); + gm.chancellor = Some("123".to_string()); + assert!(gm.game_is_over().is_ok()); + let mut p = Player::new("123".to_string()); + p.set_role(Role::Facist); + gm.lobby.players.insert("123".to_string(), p); + assert!(gm.game_is_over().is_ok()); + + let mut gm = dummy(); + gm.policies.insert(Policy::Facist, 3); + assert!(gm.game_is_over().is_ok()); + gm.chancellor = Some("123".to_string()); + assert!(gm.game_is_over().is_ok()); + let mut p = Player::new("123".to_string()); + p.set_role(Role::Hitler); + gm.lobby.players.insert("123".to_string(), p); + assert!(gm.game_is_over().is_err()); + assert!(gm.game_is_over().err().unwrap() == Role::Facist); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index c201dfb..36da93a 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -2,19 +2,25 @@ use super::super::super::super::model::state::room::Room; use super::super::lobby::Lobby; use super::super::player::Player; use super::super::policy::Policy; +use super::super::role::Role; use super::super::gameevent::GameEventType; +use super::super::gameevent::GameEvent; use log::{info, error}; +use std::collections::HashMap; +#[derive(Debug)] pub struct GameMaster { pub room: Box, pub lobby: Lobby, pub candidate_presidents: Vec, pub deck: Vec, + pub policies: HashMap, + pub president: Option, + pub chancellor: Option, } impl GameMaster { - pub fn new(room: Box) -> GameMaster { info!("created for room {}", room.room_id()); GameMaster{ @@ -22,10 +28,13 @@ impl GameMaster { lobby: Lobby::new(), candidate_presidents: vec![], deck: vec![], + policies: HashMap::new(), + president: None, + chancellor: None, } } - pub fn run(&mut self) -> Result { + pub fn run(&mut self) -> Result { loop { let r = self.run_lobby(); if r.is_ok() { @@ -37,19 +46,31 @@ impl GameMaster { self.run_game() } - pub fn run_game(&mut self) -> Result { + pub fn run_game(&mut self) -> Result { loop { self.game_is_over()?; self.game_election()?; self.game_is_over()?; let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() { GameEventType::VoteFailed => self.game_policy_select_random(), - GameEventType::GameStop => Err("game ended".to_string()), + GameEventType::GameStop => self.game_is_over(), _ => self.game_policy_select(), }?; - self.game_policy_veto(p.clone())?; - self.game_ends_with(p.clone())?; - self.game_policy_enact(p.clone())?; // todo facist policies special + if p.mode() != GameEventType::PolicySet { + error!("unexpected game event type after election vote followup: {:?}", p); + return Err(Role::Null); + } + let params = p.params(); + let param = params.first(); + if param.is_none() { + error!("unexpected missing param on {:?}: {:?}", p, param); + return Err(Role::Null); + } + let param = param.unwrap(); + let policy = Policy::from_string(param.to_string()); + self.game_policy_veto(policy.clone())?; + self.game_ends_with(policy.clone())?; + self.game_policy_enact(policy.clone())?; } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs index 45aecbd..3574066 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs @@ -6,10 +6,10 @@ use super::super::policy::Policy; use super::super::rand::rand_usize; use super::super::rand::shuffle; -use log::{debug, LevelFilter}; +use log::{debug, error, LevelFilter}; impl GameMaster { - pub fn run_game_setup(&mut self) -> Result { + pub fn run_game_setup(&mut self) -> Result { self.setup_gather_candidates()?; debug!("players: {:?}", self.candidate_presidents); self.setup_set_roles()?; @@ -20,11 +20,12 @@ impl GameMaster { Ok("ok".to_string()) } - pub fn setup_gather_candidates(&mut self) -> Result { + pub fn setup_gather_candidates(&mut self) -> Result { for player in self.players() { let p = self.player(player.clone()); if p.is_none() { - return Err(format!("missing player {}", player)); + error!("missing player {}", player); + return Err(Role::Null); } self.candidate_presidents.push(player.clone()); debug!("player = {}", player); @@ -32,11 +33,15 @@ impl GameMaster { Ok("ok".to_string()) } - pub fn setup_set_roles(&mut self) -> Result { + pub fn setup_set_roles(&mut self) -> Result { for player in self.players() { self.player(player.clone()).unwrap().set_role(Role::Liberal); } - let n = config::players_to_facists(self.players().len())?; + let n = config::players_to_facists(self.players().len()); + if n.is_err() { + return Err(Role::Null); + } + let n = n.unwrap(); for i in 0..n { debug!("picking facist {}/{} for {} players", i, n, self.players().len()); loop { @@ -54,10 +59,12 @@ impl GameMaster { break; } } + self.president = None; + self.chancellor = None; Ok("ok".to_string()) } - pub fn setup_order_candidates(&mut self) -> Result { + pub fn setup_order_candidates(&mut self) -> Result { shuffle(&mut self.candidate_presidents); let n = self.candidate_presidents.len(); for _ in 0..5 { @@ -68,7 +75,7 @@ impl GameMaster { Ok("ok".to_string()) } - pub fn setup_deck(&mut self) -> Result { + pub fn setup_deck(&mut self) -> Result { for _ in 0..config::players_to_policies_facist(self.players().len()) { self.deck.push(Policy::Facist); } @@ -79,6 +86,9 @@ impl GameMaster { shuffle(&mut self.deck); + self.policies.insert(Policy::Facist, 0); // todo start iwth 1 if 5 players? + self.policies.insert(Policy::Liberal, 0); // todo start iwth 1 if 5 players? + Ok("deck is loaded".to_string()) } } diff --git a/secert-hitler/src/controller/gamemaster/policy.rs b/secert-hitler/src/controller/gamemaster/policy.rs index 816c4e5..b5198b9 100644 --- a/secert-hitler/src/controller/gamemaster/policy.rs +++ b/secert-hitler/src/controller/gamemaster/policy.rs @@ -1,4 +1,4 @@ -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub enum Policy { Null, Facist, @@ -6,6 +6,20 @@ pub enum Policy { } impl Policy { + pub fn from_string(s: String) -> Policy { + let cases = [ + Policy::Null, + Policy::Facist, + Policy::Liberal, + ]; + for c in &cases { + if format!("{:?}", c) == s { + return c.clone(); + } + } + Policy::Null + } + pub fn new() -> Policy { Policy::Null } @@ -34,4 +48,10 @@ mod tests { r.set(Policy::Liberal); assert!(r == Policy::Liberal); } + + fn from_string() { + assert!(Policy::from_string("".to_string()) == Policy::Null); + assert!(Policy::from_string("Liberal".to_string()) == Policy::Liberal); + assert!(Policy::from_string("Facist".to_string()) == Policy::Facist); + } } diff --git a/secert-hitler/src/model/state/room.rs b/secert-hitler/src/model/state/room.rs index b5bb4c1..9ec45f3 100644 --- a/secert-hitler/src/model/state/room.rs +++ b/secert-hitler/src/model/state/room.rs @@ -1,6 +1,8 @@ use super::event; -pub trait Room { +use std::fmt; + +pub trait Room: fmt::Debug { fn rollback(&mut self, since: String); fn sync(&mut self) -> Vec; fn send(&mut self, message: String) -> Result; From 44c4089e26097bfe8037b521c0da2ccd846c6b19 Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 08:47:43 -0600 Subject: [PATCH 26/34] impl game over --- secert-hitler/src/controller/gamemaster/gamemaster/game.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index faab016..e2cab80 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -26,6 +26,9 @@ impl GameMaster { } pub fn game_election(&mut self) -> Result { + let mut ge = GameEventType::ElectionPend.build(); + let president_candidate = self.candidate_presidents.pop().unwrap(); + ge.d["targets"] = [president_candidate.clone()]; Err(Role::Null) } From 829a10f75bd5005ca91d40feb2e5483047df7fdd Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 09:01:25 -0600 Subject: [PATCH 27/34] impl gameevent serialize --- .../src/controller/gamemaster/gameevent.rs | 57 ++++++++++++++++++- .../controller/gamemaster/gamemaster/game.rs | 8 ++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index a703ee4..2e95830 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -3,8 +3,8 @@ use json; #[derive(Clone, Debug)] pub struct GameEvent { - d: json::JsonValue, - sender: String, + pub d: json::JsonValue, + pub sender: String, } #[derive(PartialEq, Eq, Debug, Clone)] @@ -122,12 +122,30 @@ impl GameEvent { } out } + + pub fn serialize(&self) -> String { + (json::object!{ + GameEventType: format!("{:?}", self.mode()), + sources: self.sources(), + targets: self.targets(), + params: self.params(), + }).dump() + } } #[cfg(test)] mod tests { use super::*; + use log::{debug, LevelFilter}; + + fn init() { + let _ = env_logger::builder() + .is_test(true) + .filter_level(LevelFilter::Trace) + .try_init(); + } + #[test] fn new() { let ge = GameEvent::new(Event{sender: "".to_string(), body: "\"a\"".to_string(), since: "".to_string()}); @@ -220,4 +238,39 @@ mod tests { assert!(ge.targets().len() == 0); assert!(ge.sources().len() == 0); } + + #[test] + fn serialize() { + init(); + let ge = GameEvent{ + d: json::object!{}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "GameStart"}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "GameStart", params: ["hi"]}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":["hi"]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + + let ge = GameEvent{ + d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]}, + sender: "a".to_string(), + }; + assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + debug!("sample gameevent serialize: {}", ge.serialize()); + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index e2cab80..434b2b5 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -5,6 +5,8 @@ use super::super::policy::Policy; use super::super::role::Role; use super::super::player::Player; +use json; + impl GameMaster { pub fn game_is_over(&mut self) -> Result { if self.policies[&Policy::Facist] >= 3 { @@ -28,7 +30,11 @@ impl GameMaster { pub fn game_election(&mut self) -> Result { let mut ge = GameEventType::ElectionPend.build(); let president_candidate = self.candidate_presidents.pop().unwrap(); - ge.d["targets"] = [president_candidate.clone()]; + ge.d["targets"] = json::array![president_candidate.clone()]; + ge.d["params"] = json::array!["president"]; + if self.room.send(ge.serialize()).is_err() { + return Err(Role::Null); + } Err(Role::Null) } From 8851886ab6d0a916514343d777952a013d82bcaf Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 20:16:26 -0600 Subject: [PATCH 28/34] make poorly named gamemaster scrape until gameeventtype --- .../gamemaster/gamemaster/gamemaster.rs | 43 ++++++++++++++++++- .../controller/gamemaster/gamemaster/lobby.rs | 24 ++++++----- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index 36da93a..89e7726 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -1,4 +1,5 @@ use super::super::super::super::model::state::room::Room; +use super::super::super::super::model::state::event::Event; use super::super::lobby::Lobby; use super::super::player::Player; use super::super::policy::Policy; @@ -6,8 +7,10 @@ use super::super::role::Role; use super::super::gameevent::GameEventType; use super::super::gameevent::GameEvent; -use log::{info, error}; +use log::{info, debug, error}; use std::collections::HashMap; +use std::thread; +use std::time; #[derive(Debug)] pub struct GameMaster { @@ -85,6 +88,23 @@ impl GameMaster { pub fn player(&mut self, id: String) -> Option<&mut Player> { self.lobby.players.get_mut(&id) } + + pub fn scrape_until_gameeventtype(&mut self, get: GameEventType) -> Result, String> { + let mut scraped = vec![]; + loop { + let events = self.room.sync(); + for e in &events { + scraped.push(e.clone()); + let ge = GameEvent::new(e.clone()); + debug!("scrape_until {:?}: ge: {:?}", get, ge); + if ge.mode() == get { + self.room.rollback(e.since.clone()); + return Ok(scraped); + } + } + thread::sleep(time::Duration::new(1, 0)); + } + } } #[cfg(test)] @@ -116,4 +136,25 @@ mod tests { let r = mrs.create(); let _ = GameMaster::new(r); } + + #[test] + fn scrape_until_get() { + let mut mrs = MockRooms::new(); + let r = mrs.create(); + let room_id = r.room_id().clone(); + let r2 = mrs.join(room_id); + assert!(r2.is_ok()); + let mut r2 = r2.unwrap(); + let mut gm = GameMaster::new(r); + gm.room.sync(); + r2.send(GameEventType::Null.build().serialize()).unwrap(); + let scraped = gm.scrape_until_gameeventtype(GameEventType::Null); + assert!(scraped.is_ok()); + let scraped = scraped.unwrap(); + assert!(scraped.len() == 1); + assert!(scraped.first().is_some()); + let e = scraped.first().unwrap(); + assert!(GameEvent::new(e.clone()).mode() == GameEventType::Null, "{:?}", e); + assert!(gm.room.sync().len() == 0); + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs index 1cc3ede..64d0fa8 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs @@ -5,7 +5,6 @@ use super::super::gameevent::GameEventType; use std::thread; use std::time; -use log::{debug, LevelFilter}; impl GameMaster { pub fn run_lobby(&mut self) -> Result { @@ -22,18 +21,17 @@ impl GameMaster { } pub fn run_lobby_scrape(&mut self) -> Result { - debug!("run_lobby_scrape:"); - let events = self.room.sync(); + let events = self.scrape_until_gameeventtype(GameEventType::GameStart)?; for e in &events { - let ge = GameEvent::new(e.clone()); - debug!("run_lobby_scrape: ge: {:?}", ge); - if ge.mode() == GameEventType::GameStart { - self.room.rollback(e.since.clone()); - self.lobby.lock(); - return self.lobby.ready(); - } self.lobby.eat(e.clone()); } + if events.len() > 0 { + let last = events.last().unwrap(); + let ge = GameEvent::new(last.clone()); + if ge.mode() == GameEventType::GameStart { + self.lobby.lock(); + } + } return self.lobby.ready(); } } @@ -44,6 +42,7 @@ mod tests { use super::super::super::super::super::model::state::mockrooms::MockRooms; use super::super::super::super::super::model::state::rooms::Rooms; use super::super::super::super::super::config; + use log::{LevelFilter}; fn init() { let _ = env_logger::builder() @@ -73,6 +72,11 @@ mod tests { for k in gm.lobby.players.keys() { players1.push(k.clone()); } + let mut r2 = mrs.join(room_id.clone()).unwrap(); + r2.send(format!(r#"{{ + "msgtype": "m.text", + "body": "{{\"GameEventType\": \"GameStart\"}}" + }}"#)).unwrap(); assert!(gm.run_lobby().is_ok()); assert!(gm.lobby.players.len() == 5, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); let players2 = gm.lobby.players.keys(); From a277e4079c4009fffab50feef1454cf4ea845367 Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 6 May 2020 21:19:17 -0600 Subject: [PATCH 29/34] run chancellor selection --- .../src/controller/gamemaster/gameevent.rs | 22 +++--- .../controller/gamemaster/gamemaster/game.rs | 79 ++++++++++++++++++- .../gamemaster/gamemaster/gamemaster.rs | 19 ++++- .../controller/gamemaster/gamemaster/setup.rs | 3 - 4 files changed, 108 insertions(+), 15 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 2e95830..802dd1a 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -125,10 +125,14 @@ impl GameEvent { pub fn serialize(&self) -> String { (json::object!{ - GameEventType: format!("{:?}", self.mode()), - sources: self.sources(), - targets: self.targets(), - params: self.params(), + body: json::stringify(json::object!{ + GameEventType: format!("{:?}", self.mode()), + sources: self.sources(), + targets: self.targets(), + params: self.params(), + }), + sender: "__gm__", + msgtype: "m.text".to_string(), }).dump() } } @@ -246,31 +250,31 @@ mod tests { d: json::object!{}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart"}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart", params: ["hi"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":[],"targets":[],"params":["hi"]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[\"hi\"]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"GameStart","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"GameEventType":"Null","sources":["hi"],"targets":["hi2"],"params":[]}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); debug!("sample gameevent serialize: {}", ge.serialize()); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 434b2b5..f7348b1 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -3,8 +3,8 @@ use super::super::gameevent::GameEvent; use super::super::gameevent::GameEventType; use super::super::policy::Policy; use super::super::role::Role; -use super::super::player::Player; +use log::debug; use json; impl GameMaster { @@ -35,7 +35,22 @@ impl GameMaster { if self.room.send(ge.serialize()).is_err() { return Err(Role::Null); } - Err(Role::Null) + let events = self.scrape_until_gameeventtype(GameEventType::ElectionSet); + if events.is_err() { + return Err(Role::Null); + } + let events = events.unwrap(); + let chancellor_candidate_event = GameEvent::new(events.last().unwrap().clone()); + let chancellor_candidate = chancellor_candidate_event.targets(); + if chancellor_candidate.len() == 0 { + debug!("no chancellor candidates found in election set"); + return self.game_election(); + } + if self.player(chancellor_candidate.last().unwrap().clone()).is_none() { + debug!("invalid chancellor candidates found in election set"); + return self.game_election(); + } + Ok(chancellor_candidate_event) } pub fn game_election_vote(&mut self) -> Result { @@ -71,6 +86,7 @@ mod tests { use super::super::super::super::super::config; use log::{debug, LevelFilter}; + use json; fn init() { let _ = env_logger::builder() @@ -158,4 +174,63 @@ mod tests { assert!(gm.game_is_over().is_err()); assert!(gm.game_is_over().err().unwrap() == Role::Facist); } + + #[test] + fn game_election() { + let mut gm = dummy(); + + debug!("sending a null event"); + let ge = GameEventType::Null.build(); + assert!(ge.mode() == GameEventType::Null); + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an empty election set event"); + let ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a params election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["params"] = json::array!["a"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a sources election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["sources"] = json::array!["b"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an empty targets election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["targets"] = json::array![]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an invalid targets election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["targets"] = json::array!["abc"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a valid targets election set event"); + let mut ge = GameEventType::ElectionSet.build(); + assert!(ge.mode() == GameEventType::ElectionSet); + ge.d["targets"] = json::array!["realplayer"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + gm.lobby.players.insert("realplayer".to_string(), Player::new("realplayer".to_string())); + + debug!("running game election"); + assert!(gm.game_election().is_ok()); + + let election_pends = gm.room.sync(); + assert!(election_pends.len() == 6, "election_pends: {:?}", election_pends); + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index 89e7726..d4db46c 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -96,8 +96,9 @@ impl GameMaster { for e in &events { scraped.push(e.clone()); let ge = GameEvent::new(e.clone()); - debug!("scrape_until {:?}: ge: {:?}", get, ge); + debug!("scrape_until {:?}: {:?}: ge: {:?}", get, ge.mode() == get, ge); if ge.mode() == get { + debug!("/scrape_until {:?}: {:?}: ge: {:?}", get, ge.mode() == get, ge); self.room.rollback(e.since.clone()); return Ok(scraped); } @@ -156,5 +157,21 @@ mod tests { let e = scraped.first().unwrap(); assert!(GameEvent::new(e.clone()).mode() == GameEventType::Null, "{:?}", e); assert!(gm.room.sync().len() == 0); + + r2.send(GameEventType::ElectionSet.build().serialize()).unwrap(); + r2.send(GameEventType::ElectionSet.build().serialize()).unwrap(); + let scraped = gm.scrape_until_gameeventtype(GameEventType::ElectionSet); + assert!(scraped.is_ok()); + let scraped = scraped.unwrap(); + assert!(scraped.len() == 1); + assert!(gm.room.sync().len() == 1); + + r2.send(GameEventType::SpecialPeek.build().serialize()).unwrap(); + r2.send(GameEventType::ElectionPend.build().serialize()).unwrap(); + let scraped = gm.scrape_until_gameeventtype(GameEventType::ElectionPend); + assert!(scraped.is_ok()); + let scraped = scraped.unwrap(); + assert!(scraped.len() == 2); + assert!(gm.room.sync().len() == 0); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs index 3574066..a9f1724 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs @@ -95,9 +95,6 @@ impl GameMaster { mod tests { use super::*; - use super::super::super::super::super::model::state::mockrooms::MockRooms; - use super::super::super::super::super::model::state::rooms::Rooms; - use super::super::super::player::Player; fn init() { let _ = env_logger::builder() From 0a0febdb49a064799f3d2a1baad624a375b966fe Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 7 May 2020 06:48:59 -0600 Subject: [PATCH 30/34] fix tests --- secert-hitler/src/controller/gamemaster/gamemaster/game.rs | 3 ++- secert-hitler/src/controller/gamemaster/gamemaster/setup.rs | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index f7348b1..711557e 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -84,6 +84,7 @@ mod tests { use super::super::super::super::super::model::state::mockrooms::MockRooms; use super::super::super::super::super::model::state::rooms::Rooms; use super::super::super::super::super::config; + use super::super::super::player::Player; use log::{debug, LevelFilter}; use json; @@ -107,7 +108,7 @@ mod tests { mrs.join(room_id).unwrap().send(format!(r#"{{ "msgtype": "m.text", "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); + }}"#)).unwrap(); assert!(gm.run_lobby().is_ok()); assert!(gm.run_game_setup().is_ok()); gm diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs index a9f1724..3574066 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs @@ -95,6 +95,9 @@ impl GameMaster { mod tests { use super::*; + use super::super::super::super::super::model::state::mockrooms::MockRooms; + use super::super::super::super::super::model::state::rooms::Rooms; + use super::super::super::player::Player; fn init() { let _ = env_logger::builder() From 3e9ce3edffd0029b3f461c56e7f5e5592bcd77cf Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 7 May 2020 06:50:19 -0600 Subject: [PATCH 31/34] fix tests --- secert-hitler/src/controller/gamemaster/gamemaster/game.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 711557e..60264e9 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -46,7 +46,8 @@ impl GameMaster { debug!("no chancellor candidates found in election set"); return self.game_election(); } - if self.player(chancellor_candidate.last().unwrap().clone()).is_none() { + let chancellor_candidate = chancellor_candidate.last().unwrap(); + if self.player(chancellor_candidate.clone()).is_none() { debug!("invalid chancellor candidates found in election set"); return self.game_election(); } From 3859f29a75fb818f6865e4914025361a7c7c0dd9 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 7 May 2020 07:46:43 -0600 Subject: [PATCH 32/34] room joining reuqires sender --- .../src/controller/gamemaster/gameevent.rs | 12 +- .../controller/gamemaster/gamemaster/game.rs | 117 +++++++++++++++++- .../gamemaster/gamemaster/gamemaster.rs | 29 +++-- .../controller/gamemaster/gamemaster/lobby.rs | 12 +- .../controller/gamemaster/gamemaster/setup.rs | 8 +- secert-hitler/src/model/state/mockroom.rs | 23 ++-- secert-hitler/src/model/state/mockrooms.rs | 22 ++-- secert-hitler/src/model/state/room.rs | 2 +- secert-hitler/src/model/state/rooms.rs | 6 +- 9 files changed, 177 insertions(+), 54 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index 802dd1a..ee4313d 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -61,7 +61,7 @@ impl GameEventType { params: [], }.dump(), }; - GameEvent::new(Event{sender: "".to_string(), body: d.dump(), since: "".to_string()}) + GameEvent::new(Event{sender: "__gm__".to_string(), body: d.dump(), since: "".to_string()}) } } @@ -75,9 +75,15 @@ impl GameEvent { if !top_level["body"].is_string() { return GameEvent{d: json::Null, sender: event.sender.clone()}; } + let body = top_level["body"].as_str().unwrap(); + let d = json::parse(&body).unwrap_or(json::Null); + let sender = event.sender.clone(); + if d.is_object() && d.has_key("sender") && d["sender"].is_string() { + // sender = d["sender"].as_str().unwrap(); + } GameEvent{ - d: json::parse(&top_level["body"].as_str().unwrap()).unwrap_or(json::Null), - sender: event.sender.clone(), + d: d, + sender: sender, } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 60264e9..17b258c 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -6,6 +6,7 @@ use super::super::role::Role; use log::debug; use json; +use std::collections::HashMap; impl GameMaster { pub fn game_is_over(&mut self) -> Result { @@ -30,6 +31,7 @@ impl GameMaster { pub fn game_election(&mut self) -> Result { let mut ge = GameEventType::ElectionPend.build(); let president_candidate = self.candidate_presidents.pop().unwrap(); + self.president = Some(president_candidate.clone()); ge.d["targets"] = json::array![president_candidate.clone()]; ge.d["params"] = json::array!["president"]; if self.room.send(ge.serialize()).is_err() { @@ -51,11 +53,55 @@ impl GameMaster { debug!("invalid chancellor candidates found in election set"); return self.game_election(); } + self.chancellor = Some(chancellor_candidate.clone()); Ok(chancellor_candidate_event) } pub fn game_election_vote(&mut self) -> Result { - Err(Role::Null) + let mut votes: HashMap = HashMap::new(); + while votes.len() < self.players().len() { + debug!("votes: {:?}", votes); + let events = self.scrape_until_gameeventtype(GameEventType::VoteSet).unwrap(); + debug!("scrape until vote set found {:?}", events); + if events.len() > 0 { + let ge = GameEvent::new(events.last().unwrap().clone()); + let sources = ge.sources(); + if sources.len() > 0 { + let player = sources.first().unwrap(); + if self.player(player.clone()).is_some() { + let params = ge.params(); + if params.len() > 0 { + votes.insert(player.clone(), params.first().unwrap() == "y"); + } + } + } + } + } + debug!("game election vote yielded: {:?}", votes); + + let mut ge = GameEventType::VoteSet.build(); + ge.d["sources"] = json::array!["__gm__"]; + let mut yays = 0; + for (player, vote) in &votes { + if *vote { + yays += 1; + } + } + let gm_vote = yays > self.players().len() / 2; + ge.d["params"] = json::array![format!("{:?}", gm_vote)]; + for (player, vote) in &votes { + ge.d["sources"].push(player.clone()); + ge.d["params"].push(format!("{:?}", vote)); + } + self.room.send(ge.serialize()); + + if gm_vote { + return Ok(GameEventType::Null.build()); // todo how to emit continue? + } else { + self.president = None; + self.chancellor = None; + return Ok(GameEventType::VoteFailed.build()); + } } pub fn game_policy_select_random(&mut self) -> Result { @@ -100,13 +146,13 @@ mod tests { fn dummy() -> GameMaster { init(); let mut mrs = MockRooms::new(); - let r = mrs.create(); + let r = mrs.create("__gm__".to_string()); let room_id = r.room_id().clone(); let mut gm = GameMaster::new(r); - for _ in 0..config::MIN_PLAYERS-2 { - assert!(mrs.join(room_id.clone()).is_ok()); + for i in 0..config::MIN_PLAYERS-2 { + assert!(mrs.join(i.to_string(), room_id.clone()).is_ok()); } - mrs.join(room_id).unwrap().send(format!(r#"{{ + mrs.join((config::MIN_PLAYERS-1).to_string(), room_id).unwrap().send(format!(r#"{{ "msgtype": "m.text", "body": "{{\"GameEventType\": \"GameStart\"}}" }}"#)).unwrap(); @@ -235,4 +281,65 @@ mod tests { let election_pends = gm.room.sync(); assert!(election_pends.len() == 6, "election_pends: {:?}", election_pends); } + + #[test] + fn game_election_vote() { + let mut gm = dummy(); + gm.lobby.players = HashMap::new(); + + debug!("sending a null event"); + let ge = GameEventType::Null.build(); + assert!(ge.mode() == GameEventType::Null); + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a valid vote from a valid player"); + let mut ge = GameEventType::VoteSet.build(); + assert!(ge.mode() == GameEventType::VoteSet); + ge.d["sources"] = json::array!["1"]; + ge.d["params"] = json::array!["n"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + gm.lobby.players.insert("1".to_string(), Player::new("1".to_string())); + + debug!("sending a valid repeat vote from a valid player"); + let mut ge = GameEventType::VoteSet.build(); + assert!(ge.mode() == GameEventType::VoteSet); + ge.d["sources"] = json::array!["1"]; + ge.d["params"] = json::array!["y"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an invalid vote from a valid player"); + let mut ge = GameEventType::VoteSet.build(); + assert!(ge.mode() == GameEventType::VoteSet); + ge.d["sources"] = json::array![]; + ge.d["params"] = json::array!["n"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + gm.lobby.players.insert("2".to_string(), Player::new("2".to_string())); + + debug!("correcting an invalid vote from a valid player"); + let mut ge = GameEventType::VoteSet.build(); + assert!(ge.mode() == GameEventType::VoteSet); + ge.d["sources"] = json::array!["2"]; + ge.d["params"] = json::array!["y"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + let ge = gm.game_election_vote(); + debug!("game election vote result: {:?}", ge); + assert!(ge.is_ok()); + + let events = gm.room.sync(); + assert!(events.len() == 1); + let e = events.last().unwrap().clone(); + let ge = GameEvent::new(e.clone()); + assert!(ge.sender == "__gm__", "post-game election vote ge: {:?} from {:?}", ge, e); + assert!(ge.mode() == GameEventType::VoteSet); + assert!(ge.sources()[0] == "__gm__"); + assert!(ge.params()[0] == "true"); + assert!(ge.params()[1] == "true"); + assert!(ge.params()[2] == "true"); + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index d4db46c..3935c62 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -51,14 +51,18 @@ impl GameMaster { pub fn run_game(&mut self) -> Result { loop { - self.game_is_over()?; - self.game_election()?; - self.game_is_over()?; + let ge = self.game_is_over()?; + self.room.send(ge.serialize()); + let ge = self.game_election()?; + self.room.send(ge.serialize()); + let ge = self.game_is_over()?; + self.room.send(ge.serialize()); let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() { GameEventType::VoteFailed => self.game_policy_select_random(), GameEventType::GameStop => self.game_is_over(), _ => self.game_policy_select(), }?; + self.room.send(p.serialize()); if p.mode() != GameEventType::PolicySet { error!("unexpected game event type after election vote followup: {:?}", p); return Err(Role::Null); @@ -71,9 +75,12 @@ impl GameMaster { } let param = param.unwrap(); let policy = Policy::from_string(param.to_string()); - self.game_policy_veto(policy.clone())?; - self.game_ends_with(policy.clone())?; - self.game_policy_enact(policy.clone())?; + let ge = self.game_policy_veto(policy.clone())?; + self.room.send(ge.serialize()); + let ge = self.game_ends_with(policy.clone())?; + self.room.send(ge.serialize()); + let ge = self.game_policy_enact(policy.clone())?; + self.room.send(ge.serialize()); } } @@ -117,7 +124,7 @@ mod tests { #[test] fn new_mockroom() { - let _ = GameMaster::new(Box::new(MockRoom::create())); + let _ = GameMaster::new(Box::new(MockRoom::create("__gm__".to_string()))); } #[test] @@ -127,23 +134,23 @@ mod tests { mrs } let mut mrs = get(); - let r = mrs.create(); + let r = mrs.create("__gm__".to_string()); let _ = GameMaster::new(r); } #[test] fn new_mockrooms() { let mut mrs = MockRooms::new(); - let r = mrs.create(); + let r = mrs.create("__gm__".to_string()); let _ = GameMaster::new(r); } #[test] fn scrape_until_get() { let mut mrs = MockRooms::new(); - let r = mrs.create(); + let r = mrs.create("__gm__".to_string()); let room_id = r.room_id().clone(); - let r2 = mrs.join(room_id); + let r2 = mrs.join("r2".to_string(), room_id); assert!(r2.is_ok()); let mut r2 = r2.unwrap(); let mut gm = GameMaster::new(r); diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs b/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs index 64d0fa8..4061344 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/lobby.rs @@ -55,15 +55,15 @@ mod tests { fn run_lobby() { init(); let mut mrs = MockRooms::new(); - let r1 = mrs.create(); + let r1 = mrs.create("__gm__".to_string()); let room_id = r1.room_id(); let mut gm = GameMaster::new(r1); for i in 0..config::MIN_PLAYERS-1 { - let mut r2 = mrs.join(room_id.clone()).unwrap(); + let mut r2 = mrs.join(i.to_string(), room_id.clone()).unwrap(); r2.send(format!(r#"{{ "msgtype": "m.text", "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); + }}"#)).unwrap(); let ready = gm.run_lobby(); assert!(ready.is_err() == (i != 3), "want {:?} for ready.is_err #{:?}, which is {:?}", i != 3, i, ready.is_err()); } @@ -72,12 +72,12 @@ mod tests { for k in gm.lobby.players.keys() { players1.push(k.clone()); } - let mut r2 = mrs.join(room_id.clone()).unwrap(); + let mut r2 = mrs.join("r2".to_string(), room_id.clone()).unwrap(); r2.send(format!(r#"{{ "msgtype": "m.text", "body": "{{\"GameEventType\": \"GameStart\"}}" - }}"#)).unwrap(); - assert!(gm.run_lobby().is_ok()); + }}"#)).unwrap(); + assert!(gm.run_lobby().is_ok()); assert!(gm.lobby.players.len() == 5, "secnd run_lobby players: {:?}, sync: {:?}", gm.lobby.players, gm.room.sync()); let players2 = gm.lobby.players.keys(); assert!(format!("{:?}", players1) == format!("{:?}", players2)); diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs index 3574066..871056d 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/setup.rs @@ -110,7 +110,7 @@ mod tests { fn run_game_setup() { init(); let mut mrs = MockRooms::new(); - let r1 = mrs.create(); + let r1 = mrs.create("__gm__".to_string()); let mut gm = GameMaster::new(r1); let r = gm.run_game_setup(); assert!(!r.is_ok()); @@ -128,7 +128,7 @@ mod tests { fn setup_gather_candidates() { init(); let mut mrs = MockRooms::new(); - let r1 = mrs.create(); + let r1 = mrs.create("__gm__".to_string()); let mut gm = GameMaster::new(r1); assert!(gm.setup_gather_candidates().is_ok()); for i in 0..config::MIN_PLAYERS { @@ -147,7 +147,7 @@ mod tests { fn setup_set_roles() { init(); let mut mrs = MockRooms::new(); - let r1 = mrs.create(); + let r1 = mrs.create("__gm__".to_string()); let mut gm = GameMaster::new(r1); assert!(gm.setup_set_roles().is_err()); for i in 0..config::MIN_PLAYERS { @@ -168,7 +168,7 @@ mod tests { fn setup_order_candidates() { init(); let mut mrs = MockRooms::new(); - let r1 = mrs.create(); + let r1 = mrs.create("__gm__".to_string()); let mut gm = GameMaster::new(r1); assert!(gm.setup_order_candidates().is_ok()); gm.candidate_presidents = ["1".to_string()].to_vec(); diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index 43adeeb..9bd02b4 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -11,14 +11,15 @@ pub struct MockRoom { room_id: String, events_s: Sender>, events_r: Receiver>, + pub sender: String, } impl MockRoom { - pub fn create() -> MockRoom { - MockRoom::join(rands()) + pub fn create(sender: String) -> MockRoom { + MockRoom::join(sender, rands()) } - pub fn join(room_id: String) -> MockRoom { + pub fn join(sender: String, room_id: String) -> MockRoom { let (s, r) = unbounded(); s.send(vec![]).ok().unwrap(); let mut mr = MockRoom { @@ -26,12 +27,12 @@ impl MockRoom { room_id: room_id.clone(), events_s: s, events_r: r, + sender: sender, }; - let id = rands(); - mr.send_as(id.clone(), format!(r#"{{ + mr.send_as(mr.sender.clone(), format!(r#"{{ "displayname": "{}", "membership": "join" - }}"#, id.clone())).unwrap(); + }}"#, mr.sender.clone())).unwrap(); mr } @@ -111,13 +112,13 @@ mod tests { use super::rands; fn _dummy() -> MockRoom { - let mut r = MockRoom::create(); + let mut r = MockRoom::create(rands()); r.since = "1".to_string(); let mut events = r.events_r.recv().ok().unwrap(); for i in 0..5 { events.push(Event{ - sender: i.to_string(), - since: i.to_string(), + sender: i.to_string(), + since: i.to_string(), body: i.to_string(), }); } @@ -134,14 +135,14 @@ mod tests { #[test] fn create() { - let mut r: MockRoom = MockRoom::create(); + let mut r: MockRoom = MockRoom::create(rands()); println!("{:?}", r.sync()); } #[test] fn join() { let rid = "a".to_string(); - let mut r: MockRoom = MockRoom::join(rid.to_string()); + let mut r: MockRoom = MockRoom::join(rands(), rid.to_string()); assert!(r.room_id == rid); let events = r.sync(); let mut found = false; diff --git a/secert-hitler/src/model/state/mockrooms.rs b/secert-hitler/src/model/state/mockrooms.rs index 17d4404..968b4bd 100644 --- a/secert-hitler/src/model/state/mockrooms.rs +++ b/secert-hitler/src/model/state/mockrooms.rs @@ -17,16 +17,18 @@ impl MockRooms { } impl Rooms for MockRooms { - fn create(&mut self) -> Box { - let room = MockRoom::create(); + fn create(&mut self, sender: String) -> Box { + let room = MockRoom::create(sender); let _room = room.room(); self.rooms.push(room); Box::new(_room) } - fn join(&self, room_id: String) -> Result, &str> { + fn join(&self, sender: String, room_id: String) -> Result, &str> { for r in &self.rooms { if r.room_id() == room_id { + let mut r = r.clone(); + r.sender = sender; let mut r = r.room(); r.send(format!(r#"{{ "displayname": "{}", @@ -48,9 +50,9 @@ mod tests { fn _dummy() -> MockRooms { let mut mrs = MockRooms::new(); for i in 0..5 { - let random = MockRoom::create(); + let random = MockRoom::create(i.to_string()); mrs.rooms.push(random); - let joined = MockRoom::join(i.to_string()); + let joined = MockRoom::join(i.to_string(), i.to_string()); mrs.rooms.push(joined); } assert!(mrs.rooms.len() == 10); @@ -67,7 +69,7 @@ mod tests { fn create() { let mut mrs = _dummy(); let was = mrs.rooms.len(); - let _ = mrs.create(); + let _ = mrs.create("abc".to_string()); let is = mrs.rooms.len(); assert!(was+1 == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); } @@ -76,7 +78,7 @@ mod tests { fn join_404() { let mrs = _dummy(); let was = mrs.rooms.len(); - let r = mrs.join("does not exist".to_string()); + let r = mrs.join("?".to_string(), "does not exist".to_string()); let is = mrs.rooms.len(); assert!(was == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); assert!(!r.is_ok()); @@ -86,7 +88,7 @@ mod tests { fn join_found() { let mrs = _dummy(); let was = mrs.rooms.len(); - let r = mrs.join("0".to_string()); + let r = mrs.join("?".to_string(), "0".to_string()); let is = mrs.rooms.len(); assert!(was == is, "was {} rooms, want {} rooms, got {} rooms", was, was+1, is); assert!(r.is_ok()); @@ -96,8 +98,8 @@ mod tests { #[test] fn join_clobber() { let mrs = _dummy(); - let mut a = mrs.join("0".to_string()).ok().unwrap(); - let mut b = mrs.join("0".to_string()).ok().unwrap(); + let mut a = mrs.join("?".to_string(), "0".to_string()).ok().unwrap(); + let mut b = mrs.join("?".to_string(), "0".to_string()).ok().unwrap(); assert!(a.room_id() == b.room_id()); diff --git a/secert-hitler/src/model/state/room.rs b/secert-hitler/src/model/state/room.rs index 9ec45f3..8babf46 100644 --- a/secert-hitler/src/model/state/room.rs +++ b/secert-hitler/src/model/state/room.rs @@ -18,7 +18,7 @@ mod tests { #[test] fn mockroom() { fn gen() -> impl Room { - let r = MockRoom::create(); + let r = MockRoom::create("123".to_string()); r } gen(); diff --git a/secert-hitler/src/model/state/rooms.rs b/secert-hitler/src/model/state/rooms.rs index d5945dd..e73be2a 100644 --- a/secert-hitler/src/model/state/rooms.rs +++ b/secert-hitler/src/model/state/rooms.rs @@ -1,8 +1,8 @@ use super::room::Room; pub trait Rooms { - fn create(&mut self) -> Box; - fn join(&self, room_id: String) -> Result, &str>; + fn create(&mut self, sender: String) -> Box; + fn join(&self, sender: String, room_id: String) -> Result, &str>; } #[cfg(test)] @@ -18,7 +18,7 @@ mod tests { r } let mut rooms = gen(); - let mut room_ptr: Box = rooms.create(); + let mut room_ptr: Box = rooms.create("abc".to_string()); assert!(room_ptr.send("hi".to_string()).is_ok()); } } From 14aab048850b10b46350ff53873617834155e0d4 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 7 May 2020 08:18:50 -0600 Subject: [PATCH 33/34] room joining reuqires sender --- .../src/controller/gamemaster/gameevent.rs | 11 ++- .../controller/gamemaster/gamemaster/game.rs | 67 ++++++++++++++++--- .../gamemaster/gamemaster/gamemaster.rs | 37 +--------- secert-hitler/src/model/state/mockroom.rs | 2 +- 4 files changed, 67 insertions(+), 50 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gameevent.rs b/secert-hitler/src/controller/gamemaster/gameevent.rs index ee4313d..41ed748 100644 --- a/secert-hitler/src/controller/gamemaster/gameevent.rs +++ b/secert-hitler/src/controller/gamemaster/gameevent.rs @@ -137,7 +137,6 @@ impl GameEvent { targets: self.targets(), params: self.params(), }), - sender: "__gm__", msgtype: "m.text".to_string(), }).dump() } @@ -256,31 +255,31 @@ mod tests { d: json::object!{}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[],\"targets\":[],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart"}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart", params: ["hi"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[\"hi\"]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[],\"targets\":[],\"params\":[\"hi\"]}","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "GameStart", sources: ["hi"], targets: ["hi2"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"GameStart\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize()); let ge = GameEvent{ d: json::object!{GameEventType: "Null", sources: ["hi"], targets: ["hi2"]}, sender: "a".to_string(), }; - assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","sender":"__gm__","msgtype":"m.text"}"#, "{}", ge.serialize()); + assert!(ge.serialize() == r#"{"body":"{\"GameEventType\":\"Null\",\"sources\":[\"hi\"],\"targets\":[\"hi2\"],\"params\":[]}","msgtype":"m.text"}"#, "{}", ge.serialize()); debug!("sample gameevent serialize: {}", ge.serialize()); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 17b258c..2d119d7 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -4,11 +4,46 @@ use super::super::gameevent::GameEventType; use super::super::policy::Policy; use super::super::role::Role; -use log::debug; +use log::{debug, error}; use json; use std::collections::HashMap; impl GameMaster { + pub fn run_game(&mut self) -> Result { + loop { + let ge = self.game_is_over()?; + self.room.send(ge.serialize()); + let ge = self.game_election()?; + self.room.send(ge.serialize()); + let ge = self.game_is_over()?; + self.room.send(ge.serialize()); + let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() { + GameEventType::VoteFailed => self.game_policy_select_random(), + GameEventType::GameStop => self.game_is_over(), + _ => self.game_policy_select(), + }?; + self.room.send(p.serialize()); + if p.mode() != GameEventType::PolicySet { + error!("unexpected game event type after election vote followup: {:?}", p); + return Err(Role::Null); + } + let params = p.params(); + let param = params.first(); + if param.is_none() { + error!("unexpected missing param on {:?}: {:?}", p, param); + return Err(Role::Null); + } + let param = param.unwrap(); + let policy = Policy::from_string(param.to_string()); + let ge = self.game_policy_veto(policy.clone())?; + self.room.send(ge.serialize()); + let ge = self.game_ends_with(policy.clone())?; + self.room.send(ge.serialize()); + let ge = self.game_policy_enact(policy.clone())?; + self.room.send(ge.serialize()); + } + } + pub fn game_is_over(&mut self) -> Result { if self.policies[&Policy::Facist] >= 3 { let chancellor = self.chancellor.clone(); @@ -34,9 +69,7 @@ impl GameMaster { self.president = Some(president_candidate.clone()); ge.d["targets"] = json::array![president_candidate.clone()]; ge.d["params"] = json::array!["president"]; - if self.room.send(ge.serialize()).is_err() { - return Err(Role::Null); - } + self.room.send(ge.serialize()).unwrap(); let events = self.scrape_until_gameeventtype(GameEventType::ElectionSet); if events.is_err() { return Err(Role::Null); @@ -95,20 +128,30 @@ impl GameMaster { } self.room.send(ge.serialize()); - if gm_vote { - return Ok(GameEventType::Null.build()); // todo how to emit continue? - } else { + if ! gm_vote { self.president = None; self.chancellor = None; return Ok(GameEventType::VoteFailed.build()); } + + if self.game_is_over().is_err() { + return Ok(GameEventType::GameStop.build()); + } + Ok(GameEventType::Null.build()) } pub fn game_policy_select_random(&mut self) -> Result { - Err(Role::Null) + let policy = self.deck.pop().unwrap().clone(); + let mut ge = GameEventType::PolicySet.build(); + ge.d["params"] = json::array![format!("{:?}", policy)]; + self.room.send(ge.serialize()).unwrap(); } pub fn game_policy_select(&mut self) -> Result { + let draw = vec![]; + for _ in 0..3 { + draw.push(self.deck.pop().unwrap().clone()); + } Err(Role::Null) } @@ -342,4 +385,12 @@ mod tests { assert!(ge.params()[1] == "true"); assert!(ge.params()[2] == "true"); } + + #[test] + fn game_policy_select() { + } + + #[test] + fn game_policy_select_random() { + } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index 3935c62..242280d 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -18,6 +18,7 @@ pub struct GameMaster { pub lobby: Lobby, pub candidate_presidents: Vec, pub deck: Vec, + pub discard: Vec, pub policies: HashMap, pub president: Option, pub chancellor: Option, @@ -31,6 +32,7 @@ impl GameMaster { lobby: Lobby::new(), candidate_presidents: vec![], deck: vec![], + discard: vec![], policies: HashMap::new(), president: None, chancellor: None, @@ -49,41 +51,6 @@ impl GameMaster { self.run_game() } - pub fn run_game(&mut self) -> Result { - loop { - let ge = self.game_is_over()?; - self.room.send(ge.serialize()); - let ge = self.game_election()?; - self.room.send(ge.serialize()); - let ge = self.game_is_over()?; - self.room.send(ge.serialize()); - let p = match self.game_election_vote().unwrap_or(GameEventType::GameStop.build()).mode() { - GameEventType::VoteFailed => self.game_policy_select_random(), - GameEventType::GameStop => self.game_is_over(), - _ => self.game_policy_select(), - }?; - self.room.send(p.serialize()); - if p.mode() != GameEventType::PolicySet { - error!("unexpected game event type after election vote followup: {:?}", p); - return Err(Role::Null); - } - let params = p.params(); - let param = params.first(); - if param.is_none() { - error!("unexpected missing param on {:?}: {:?}", p, param); - return Err(Role::Null); - } - let param = param.unwrap(); - let policy = Policy::from_string(param.to_string()); - let ge = self.game_policy_veto(policy.clone())?; - self.room.send(ge.serialize()); - let ge = self.game_ends_with(policy.clone())?; - self.room.send(ge.serialize()); - let ge = self.game_policy_enact(policy.clone())?; - self.room.send(ge.serialize()); - } - } - pub fn players(&self) -> Vec { let mut players = vec![]; for k in self.lobby.players.keys() { diff --git a/secert-hitler/src/model/state/mockroom.rs b/secert-hitler/src/model/state/mockroom.rs index 9bd02b4..1946f9a 100644 --- a/secert-hitler/src/model/state/mockroom.rs +++ b/secert-hitler/src/model/state/mockroom.rs @@ -75,7 +75,7 @@ impl Room for MockRoom { } fn send(&mut self, message: String) -> Result { - self.send_as(rands(), message) + self.send_as(self.sender.clone(), message) } fn room_id(&self) -> String { From 72d5fe6f2bc51d186dccae8ef46e17dd7d6226a3 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 7 May 2020 08:57:04 -0600 Subject: [PATCH 34/34] impl game policy select and rando select --- .../controller/gamemaster/gamemaster/game.rs | 214 +++++++++++++++++- .../gamemaster/gamemaster/gamemaster.rs | 2 + 2 files changed, 211 insertions(+), 5 deletions(-) diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs index 2d119d7..f6d945b 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/game.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/game.rs @@ -23,7 +23,9 @@ impl GameMaster { _ => self.game_policy_select(), }?; self.room.send(p.serialize()); - if p.mode() != GameEventType::PolicySet { + if p.mode() == GameEventType::Null { + continue; + } else if p.mode() != GameEventType::PolicySet { error!("unexpected game event type after election vote followup: {:?}", p); return Err(Role::Null); } @@ -115,7 +117,7 @@ impl GameMaster { let mut ge = GameEventType::VoteSet.build(); ge.d["sources"] = json::array!["__gm__"]; let mut yays = 0; - for (player, vote) in &votes { + for (_, vote) in &votes { if *vote { yays += 1; } @@ -141,18 +143,126 @@ impl GameMaster { } pub fn game_policy_select_random(&mut self) -> Result { + self.failed_votes += 1; + if self.failed_votes < 3 { + return Ok(GameEventType::Null.build()); + } let policy = self.deck.pop().unwrap().clone(); + self.discard.push(policy.clone()); let mut ge = GameEventType::PolicySet.build(); ge.d["params"] = json::array![format!("{:?}", policy)]; - self.room.send(ge.serialize()).unwrap(); + Ok(ge) } pub fn game_policy_select(&mut self) -> Result { - let draw = vec![]; + let mut draw = vec![]; + let mut to_discard = vec![]; for _ in 0..3 { draw.push(self.deck.pop().unwrap().clone()); + to_discard.push(self.deck.pop().unwrap().clone()); } - Err(Role::Null) + + let mut ge = GameEventType::CardPend.build(); + if self.president.is_none() { + return Err(Role::Null); + } + ge.d["targets"] = json::array![self.president.clone().unwrap().clone()]; + ge.d["params"] = json::array![]; + for policy in &draw { + ge.d["params"].push(format!("{:?}", policy)); + } + self.room.send(ge.serialize()).unwrap(); + + draw.clear(); + loop { + let events = self.scrape_until_gameeventtype(GameEventType::CardPick); + if events.is_err() { + return Err(Role::Null); + } + let events = events.unwrap(); + if events.len() == 0 { + return Err(Role::Null); + } + let card_pick_event = GameEvent::new(events.last().unwrap().clone()); + let sources = card_pick_event.sources(); + if sources.len() == 0 || sources.first().unwrap().clone() != self.president.clone().unwrap() { + continue + } + let params = card_pick_event.params(); + if params.len() != 2 { + continue + } + for param in ¶ms { + let policy = Policy::from_string(param.clone()); + if policy != Policy::Null { + draw.push(policy); + } + } + if draw.len() != params.len() { + continue; + } + break; + } + + let mut ge = GameEventType::CardPend.build(); + if self.chancellor.is_none() { + return Err(Role::Null); + } + ge.d["targets"] = json::array![self.chancellor.clone().unwrap().clone()]; + ge.d["params"] = json::array![]; + for policy in &draw { + ge.d["params"].push(format!("{:?}", policy)); + } + self.room.send(ge.serialize()).unwrap(); + + draw.clear(); + loop { + let events = self.scrape_until_gameeventtype(GameEventType::CardPick); + if events.is_err() { + return Err(Role::Null); + } + let events = events.unwrap(); + if events.len() == 0 { + return Err(Role::Null); + } + let card_pick_event = GameEvent::new(events.last().unwrap().clone()); + let sources = card_pick_event.sources(); + if sources.len() == 0 || sources.first().unwrap().clone() != self.chancellor.clone().unwrap() { + continue + } + let params = card_pick_event.params(); + if params.len() != 1 { + continue + } + for param in ¶ms { + let policy = Policy::from_string(param.clone()); + if policy != Policy::Null { + draw.push(policy); + } + } + if draw.len() != params.len() { + continue; + } + break; + } + + let policy = draw[0].clone(); + for i in 0..to_discard.len() { + if policy == to_discard[i] { + to_discard.remove(i); + break; + } + } + if to_discard.len() == 3 { + return Err(Role::Null); + } + for i in &to_discard { + self.discard.push(i.clone()); + } + + let mut ge = GameEventType::PolicySet.build(); + ge.d["params"] = json::array!(format!("{:?}", policy)); + Ok(ge) } pub fn game_policy_veto(&mut self, _p: Policy) -> Result { @@ -388,9 +498,103 @@ mod tests { #[test] fn game_policy_select() { + let mut gm = dummy(); + gm.president = Some("president".to_string()); + gm.chancellor = Some("chancellor".to_string()); + + debug!("sending an irrelevant event to pres picking a policy"); + let mut ge = GameEventType::Null.build(); + assert!(ge.mode() == GameEventType::Null); + ge.d["sources"] = json::array!["2"]; + ge.d["params"] = json::array!["y"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a invalid president card pick"); + let mut ge = GameEventType::CardPick.build(); + assert!(ge.mode() == GameEventType::CardPick); + ge.d["sources"] = json::array!["president"]; + ge.d["params"] = json::array!["abc"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a short president card pick"); + let mut ge = GameEventType::CardPick.build(); + assert!(ge.mode() == GameEventType::CardPick); + ge.d["sources"] = json::array!["president"]; + ge.d["params"] = json::array!["Facist"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a valid president card pick"); + let mut ge = GameEventType::CardPick.build(); + assert!(ge.mode() == GameEventType::CardPick); + ge.d["sources"] = json::array!["president"]; + ge.d["params"] = json::array!["Facist", "Liberal"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending an irrelevant event to chan picking a policy"); + let mut ge = GameEventType::Null.build(); + assert!(ge.mode() == GameEventType::Null); + ge.d["sources"] = json::array!["2"]; + ge.d["params"] = json::array!["y"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a invalid chan card pick"); + let mut ge = GameEventType::CardPick.build(); + assert!(ge.mode() == GameEventType::CardPick); + ge.d["sources"] = json::array!["chancellor"]; + ge.d["params"] = json::array!["abc"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a short chan card pick"); + let mut ge = GameEventType::CardPick.build(); + assert!(ge.mode() == GameEventType::CardPick); + ge.d["sources"] = json::array!["chancellor"]; + ge.d["params"] = json::array![]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + debug!("sending a valid chan card pick"); + let mut ge = GameEventType::CardPick.build(); + assert!(ge.mode() == GameEventType::CardPick); + ge.d["sources"] = json::array!["chancellor"]; + ge.d["params"] = json::array!["Facist"]; + assert!(gm.room.send(ge.serialize()).is_ok()); + debug!("sent: {}", ge.serialize()); + + let ge = gm.game_policy_select(); + assert!(ge.is_ok()); + let ge = ge.unwrap(); + assert!(ge.mode() == GameEventType::PolicySet); + assert!(ge.params().len() == 1); + assert!(ge.params().first().unwrap() == "Facist"); + assert!(gm.discard.len() == 2); + // todo assert cards picked were viable } #[test] fn game_policy_select_random() { + let mut gm = dummy(); + gm.failed_votes = 0; + let ge = gm.game_policy_select_random(); + assert!(ge.is_ok()); + assert!(ge.unwrap().mode() == GameEventType::Null); + assert!(gm.discard.len() == 0); + + let mut gm = dummy(); + gm.failed_votes = 2; + let ge = gm.game_policy_select_random(); + assert!(ge.is_ok()); + let ge = ge.unwrap(); + assert!(ge.clone().mode() == GameEventType::PolicySet); + assert!(ge.clone().params().len() == 1); + let policy = Policy::from_string(ge.clone().params().first().clone().unwrap().clone()); + assert!(policy != Policy::Null); + assert!(gm.discard.len() == 1); + assert!(gm.discard.first().unwrap().clone() == policy); } } diff --git a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs index 242280d..ab14c8c 100644 --- a/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs +++ b/secert-hitler/src/controller/gamemaster/gamemaster/gamemaster.rs @@ -22,6 +22,7 @@ pub struct GameMaster { pub policies: HashMap, pub president: Option, pub chancellor: Option, + pub failed_votes: usize, } impl GameMaster { @@ -36,6 +37,7 @@ impl GameMaster { policies: HashMap::new(), president: None, chancellor: None, + failed_votes: 0, } }