From cea014676635acd24727be21b6d74c64993d11f5 Mon Sep 17 00:00:00 2001 From: Mat Date: Sun, 5 Jan 2025 20:54:54 +0200 Subject: [PATCH] room.d: avoid pointless work --- src/server/messages.d | 30 +++++++------ src/server/room.d | 98 ++++++++----------------------------------- src/server/server.d | 4 +- src/server/user.d | 4 +- 4 files changed, 36 insertions(+), 100 deletions(-) diff --git a/src/server/messages.d b/src/server/messages.d index 72065d4..69dc3c7 100644 --- a/src/server/messages.d +++ b/src/server/messages.d @@ -8,6 +8,7 @@ module soulfind.server.messages; import soulfind.defines : blue, norm; import soulfind.server.room : Ticker; +import soulfind.server.user : User; import std.algorithm : sort; import std.bitmanip : Endian, nativeToLittleEndian, peek; import std.stdio : writefln; @@ -791,37 +792,34 @@ class SRoomList : SMessage class SJoinRoom : SMessage { - this(string room_name, string[] usernames, uint[string] statuses, - uint[string] speeds, uint[string] upload_numbers, - uint[string] shared_files, uint[string] shared_folders, - string[string] country_codes) scope + this(string room_name, User[string] users) scope { super(JoinRoom); write!string(room_name); - const n = cast(uint) usernames.length; + const n = cast(uint) users.length; write!uint(n); - foreach (username ; usernames) write!string(username); + foreach (username, user ; users) write!string(username); write!uint(n); - foreach (username ; usernames) write!uint(statuses[username]); + foreach (user ; users) write!uint(user.status); write!uint(n); - foreach (username ; usernames) + foreach (user ; users) { - write!uint(speeds [username]); - write!uint(upload_numbers [username]); + write!uint(user.speed); + write!uint(user.upload_number); write!uint(0); // unknown, obsolete - write!uint(shared_files [username]); - write!uint(shared_folders [username]); + write!uint(user.shared_files); + write!uint(user.shared_folders); } write!uint(n); - foreach (username ; usernames) write!uint(0); // slots_full, obsolete + foreach (user ; users) write!uint(0); // slots_full, obsolete write!uint(n); - foreach (username ; usernames) write!string(country_codes[username]); + foreach (user ; users) write!string(user.country_code); } } @@ -1071,13 +1069,13 @@ class SItemSimilarUsers : SMessage class SRoomTicker : SMessage { - this(string room_name, Ticker[] tickers) scope + this(string room_name, Ticker[string] tickers) scope { super(RoomTicker); write!string(room_name); write!uint(cast(uint) tickers.length); - foreach (ticker ; sort_timestamp(tickers)) + foreach (ticker ; sort_timestamp(tickers.values)) { write!string(ticker.username); write!string(ticker.content); diff --git a/src/server/room.d b/src/server/room.d index c860e55..93d0c34 100644 --- a/src/server/room.d +++ b/src/server/room.d @@ -21,7 +21,7 @@ class Room { string name; - private User[string] user_list; + private User[string] users; private Ticker[string] tickers; @@ -35,20 +35,17 @@ class Room void add_user(User user) { - if (user.username in user_list) + if (user.username in users) return; - user_list[user.username] = user; + users[user.username] = user; scope joined_room_msg = new SUserJoinedRoom( name, user.username, user.status, user.speed, user.upload_number, user.shared_files, user.shared_folders, user.country_code ); - scope join_room_msg = new SJoinRoom( - name, user_names, statuses, speeds, upload_numbers, - shared_files, shared_folders, country_codes - ); - scope tickers_msg = new SRoomTicker(name, tickers.values); + scope join_room_msg = new SJoinRoom(name, users); + scope tickers_msg = new SRoomTicker(name, tickers); send_to_all(joined_room_msg); user.send_message(join_room_msg); @@ -57,10 +54,10 @@ class Room void remove_user(string username) { - if (username !in user_list) + if (username !in users) return; - user_list.remove(username); + users.remove(username); scope msg = new SUserLeftRoom(username, name); send_to_all(msg); @@ -68,76 +65,17 @@ class Room bool is_joined(string username) { - return (username in user_list) ? true : false; + return (username in users) ? true : false; } ulong num_users() { - return user_list.length; - } - - private string[] user_names() - { - return user_list.keys; - } - - private uint[string] statuses() - { - uint[string] statuses; - foreach (user ; user_list) - statuses[user.username] = user.status; - - return statuses; - } - - private uint[string] speeds() - { - uint[string] speeds; - foreach (user ; user_list) - speeds[user.username] = user.speed; - - return speeds; - } - - private uint[string] upload_numbers() - { - uint[string] upload_numbers; - foreach (user ; user_list) - upload_numbers[user.username] = user.upload_number; - - return upload_numbers; - } - - private uint[string] shared_files() - { - uint[string] shared_files; - foreach (user ; user_list) - shared_files[user.username] = user.shared_files; - - return shared_files; - } - - private uint[string] shared_folders() - { - uint[string] shared_folders; - foreach (user ; user_list) - shared_folders[user.username] = user.shared_folders; - - return shared_folders; - } - - private string[string] country_codes() - { - string[string] country_codes; - foreach (user ; user_list) - country_codes[user.username] = user.country_code; - - return country_codes; + return users.length; } void send_to_all(scope SMessage msg) { - foreach (user ; user_list) + foreach (user ; users) user.send_message(msg); } @@ -146,7 +84,7 @@ class Room void say(string username, string message) { - if (username !in user_list) + if (username !in users) return; scope msg = new SSayChatroom(name, username, message); @@ -158,7 +96,7 @@ class Room void add_ticker(string username, string content) { - if (username !in user_list) + if (username !in users) return; if (username in tickers && tickers[username].content == content) @@ -193,25 +131,25 @@ class Room class GlobalRoom { - private User[string] user_list; + private User[string] users; void add_user(User user) { - if (user.username !in user_list) - user_list[user.username] = user; + if (user.username !in users) + users[user.username] = user; } void remove_user(string username) { - if (username in user_list) - user_list.remove(username); + if (username in users) + users.remove(username); } void say(string room_name, string username, string message) { scope msg = new SGlobalRoomMessage(room_name, username, message); - foreach (user ; user_list) + foreach (user ; users) user.send_message(msg); } } diff --git a/src/server/server.d b/src/server/server.d index 3224c1f..bb4d417 100644 --- a/src/server/server.d +++ b/src/server/server.d @@ -350,7 +350,7 @@ class Server ulong[string] room_stats() { ulong[string] stats; - foreach (room ; room_list.values) stats[room.name] = room.num_users; + foreach (room ; room_list) stats[room.name] = room.num_users; return stats; } @@ -544,7 +544,7 @@ class Server case "rooms": string list; - foreach (room ; room_list.values) + foreach (room ; room_list) list ~= format!("%s:%d ")(room.name, room.num_users); admin_pm(admin, list); break; diff --git a/src/server/user.d b/src/server/user.d index fd2d3d0..3c813e2 100644 --- a/src/server/user.d +++ b/src/server/user.d @@ -371,12 +371,12 @@ class User void leave_joined_rooms() { - foreach (name, room ; joined_rooms)leave_room(name); + foreach (name, room ; joined_rooms) leave_room(name); } string h_joined_rooms() { - return joined_rooms.keys.join(", "); + return joined_rooms.byKey.join(", "); }