Skip to content

Commit 843cb7e

Browse files
committed
db.d: simplify room list retrieval
1 parent 602457d commit 843cb7e

File tree

5 files changed

+89
-62
lines changed

5 files changed

+89
-62
lines changed

src/db.d

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -970,39 +970,48 @@ final class Database
970970
return RoomType.non_existent;
971971
}
972972

973-
string[] rooms(string owner = null,
974-
string member = null,
975-
RoomMemberType member_type = RoomMemberType.any)
973+
string[] public_rooms()
976974
{
977-
Appender!string sql;
978-
Appender!(string[]) parameters;
975+
enum sql = text(
976+
"SELECT r.room FROM ", rooms_table, " r",
977+
" WHERE r.type = ?;"
978+
);
979+
enum parameters = [text(cast(uint) RoomType._public)];
979980

980-
sql ~= text("SELECT r.room FROM ", rooms_table, " r");
981+
Appender!(string[]) rooms;
982+
foreach (record ; query(sql, parameters)) rooms ~= record[0];
983+
return rooms[];
984+
}
981985

982-
if (owner !is null) {
983-
sql ~= text(" WHERE r.type = ? AND r.owner = ?");
984-
parameters ~= [text(cast(uint) RoomType._private), owner];
985-
}
986-
else if (member !is null) {
987-
sql ~= text(
988-
" JOIN ", room_members_table, " m ON r.room = m.room",
989-
" WHERE r.type = ? AND m.username = ?"
990-
);
991-
parameters ~= [text(cast(uint) RoomType._private), member];
986+
string[] owned_rooms(string username)
987+
{
988+
enum sql = text(
989+
"SELECT r.room FROM ", rooms_table, " r",
990+
" WHERE r.type != ? AND r.owner = ?;"
991+
);
992+
auto parameters = [text(cast(uint) RoomType._public), username];
992993

993-
if (member_type != RoomMemberType.any) {
994-
sql ~= " AND m.type = ?";
995-
parameters ~= text(cast(uint) member_type);
996-
}
997-
}
998-
else {
999-
sql ~= text(" WHERE r.type = ?");
1000-
parameters ~= text(cast(uint) RoomType._public);
994+
Appender!(string[]) rooms;
995+
foreach (record ; query(sql, parameters)) rooms ~= record[0];
996+
return rooms[];
997+
}
998+
999+
string[] member_rooms(RoomMemberType type)(string username)
1000+
{
1001+
auto sql = text(
1002+
"SELECT r.room FROM ", rooms_table, " r",
1003+
" JOIN ", room_members_table, " m ON r.room = m.room",
1004+
" WHERE r.type != ? AND m.username = ?"
1005+
);
1006+
auto parameters = [text(cast(uint) RoomType._public), username];
1007+
1008+
if (type != RoomMemberType.any) {
1009+
sql ~= " AND m.type = ?";
1010+
parameters ~= text(cast(uint) type);
10011011
}
1002-
sql ~= ";";
10031012

10041013
Appender!(string[]) rooms;
1005-
foreach (record ; query(sql[], parameters[])) rooms ~= record[0];
1014+
foreach (record ; query(sql, parameters)) rooms ~= record[0];
10061015
return rooms[];
10071016
}
10081017

src/server/cmdhandler.d

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ final class CommandHandler
154154
case "rooms":
155155
Room room;
156156
Appender!string output;
157-
const names = server.db.rooms;
157+
const names = server.db.public_rooms;
158158
output ~= text(names.length, " public rooms.");
159159
foreach (ref name ; names) {
160160
ulong num_users;
@@ -693,7 +693,9 @@ final class CommandHandler
693693
string rooms(bool is_owner = true) {
694694
Appender!string output;
695695
const rooms = is_owner
696-
? server.db.rooms(username) : server.db.rooms(null, username);
696+
? server.db.owned_rooms(username)
697+
: server.db.member_rooms!(RoomMemberType.any)(username);
698+
697699
if (rooms.length == 0)
698700
return output[];
699701

src/server/room.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ final class Room
8787

8888
bool can_access(string username)
8989
{
90-
return type != RoomType._private
90+
return type == RoomType._public
9191
|| is_joined(username)
9292
|| db.can_access_room(name, username);
9393
}

src/server/server.d

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -724,11 +724,44 @@ final class Server
724724
if (user is null)
725725
return;
726726

727-
auto public_rooms = room_stats;
728-
auto owned_rooms = room_stats(username);
729-
auto member_rooms = room_stats(null, username);
730-
auto operated_rooms = db.rooms(
731-
null, username, RoomMemberType.operator
727+
RoomInfo[] public_room_stats()
728+
{
729+
Appender!(RoomInfo[]) stats;
730+
foreach (ref room_name ; db.public_rooms) {
731+
auto room = get_room(room_name);
732+
733+
if (room !is null)
734+
stats ~= RoomInfo(room_name, cast(uint) room.num_users);
735+
}
736+
return stats[];
737+
}
738+
739+
RoomInfo[] private_room_stats(string username, bool is_owner = false)
740+
{
741+
string[] rooms;
742+
if (is_owner)
743+
rooms = db.owned_rooms(username);
744+
else
745+
rooms = db.member_rooms!(RoomMemberType.any)(username);
746+
747+
Appender!(RoomInfo[]) stats;
748+
foreach (ref room_name ; rooms) {
749+
uint num_users;
750+
auto room = get_room(room_name);
751+
752+
if (room !is null)
753+
num_users = cast(uint) room.num_users;
754+
755+
stats ~= RoomInfo(room_name, num_users);
756+
}
757+
return stats[];
758+
}
759+
760+
auto public_rooms = public_room_stats;
761+
auto owned_rooms = private_room_stats(username, true);
762+
auto member_rooms = private_room_stats(username);
763+
auto operated_rooms = db.member_rooms!(RoomMemberType.operator)(
764+
username
732765
);
733766
scope list_response_msg = new SRoomList(
734767
public_rooms,
@@ -770,25 +803,6 @@ final class Server
770803
user.send_message!(Logging.disabled)(msg);
771804
}
772805

773-
private RoomInfo[] room_stats(string owner = null, string member = null)
774-
{
775-
Room room;
776-
Appender!(RoomInfo[]) stats;
777-
778-
foreach (ref room_name ; db.rooms(owner, member)) {
779-
uint num_users;
780-
room = get_room(room_name);
781-
782-
if (room !is null)
783-
num_users = cast(uint) room.num_users;
784-
else if (owner is null && member is null)
785-
continue;
786-
787-
stats ~= RoomInfo(room_name, num_users);
788-
}
789-
return stats[];
790-
}
791-
792806

793807
// Users
794808

src/setup/setup.d

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -552,11 +552,11 @@ final class Setup
552552
? text("until ", privileged_until.toSimpleString) : "no";
553553
const supporter = (privileged_until > SysTime()) ? "yes" : "no";
554554
const searchable = db.is_user_unsearchable(username) ? "no" : "yes";
555-
const private_rooms_owner = db.rooms(username).join(", ");
556-
const private_rooms_member = db.rooms(null, username).join(", ");
557-
const private_rooms_operator = db.rooms(
558-
null, username, RoomMemberType.operator
559-
).join(", ");
555+
const rooms_owner = db.owned_rooms(username).join(", ");
556+
const rooms_member = db.member_rooms!(RoomMemberType.any)(
557+
username).join(", ");
558+
const rooms_operator = db.member_rooms!(RoomMemberType.operator)(
559+
username).join(", ");
560560
const tickers = db.user_tickers!(RoomType.any)(username);
561561

562562
if (banned_until == SysTime.max)
@@ -576,9 +576,9 @@ final class Setup
576576
"\n\tfiles: ", stats.shared_files,
577577
"\n\tfolders: ", stats.shared_folders,
578578
"\n\tupload speed: ", stats.upload_speed,
579-
"\n\towned private rooms: ", private_rooms_owner,
580-
"\n\tjoined private rooms: ", private_rooms_member,
581-
"\n\toperated private rooms: ", private_rooms_operator,
579+
"\n\towned rooms: ", rooms_owner,
580+
"\n\tmember rooms: ", rooms_member,
581+
"\n\toperated rooms: ", rooms_operator,
582582
"\n\troom tickers: "
583583
);
584584

@@ -633,7 +633,9 @@ final class Setup
633633
string rooms(bool is_owner = true) {
634634
Appender!string output;
635635
const rooms = is_owner
636-
? db.rooms(username) : db.rooms(null, username);
636+
? db.owned_rooms(username)
637+
: db.member_rooms!(RoomMemberType.any)(username);
638+
637639
if (rooms.length == 0)
638640
return output[];
639641

0 commit comments

Comments
 (0)