Skip to content

Commit 49a18fc

Browse files
committed
Extend private room and ticker data in user data export
1 parent 4f2d23d commit 49a18fc

File tree

2 files changed

+146
-94
lines changed

2 files changed

+146
-94
lines changed

src/server/cmdhandler.d

Lines changed: 87 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -681,19 +681,6 @@ final class CommandHandler
681681
quot, user.watched_usernames.join(j_quot), quot
682682
).replace(d_quot, "");
683683

684-
const rooms_owner = text(
685-
quot, server.db.rooms(username).join(j_quot), quot
686-
).replace(d_quot, "");
687-
688-
const rooms_member = text(
689-
quot, server.db.rooms(null, username).join(j_quot), quot
690-
).replace(d_quot, "");
691-
692-
const rooms_operator = text(
693-
quot, server.db.rooms(null, username, RoomMemberType.operator)
694-
.join(j_quot), quot
695-
).replace(d_quot, "");
696-
697684
auto obfuscation_type = "null";
698685
if (user.obfuscation_type == ObfuscationType.rotated)
699686
obfuscation_type = text(quot, "rotated", quot);
@@ -703,61 +690,73 @@ final class CommandHandler
703690
quot, cast(uint) user.obfuscation_type, quot
704691
);
705692

706-
Appender!string output;
707-
output ~= text(
708-
"{",
709-
"\n \"username\": \"", username, "\",",
710-
"\n \"session_data\": {",
711-
"\n \"status\": \"", status, "\",",
712-
"\n \"client_version\": \"", user.client_version, "\",",
713-
"\n \"ip_address\": \"", user.address.toAddrString ~ "\",",
714-
"\n \"port\": ", user.address.port, ",",
715-
"\n \"obfuscated_port\": ", user.obfuscated_port, ",",
716-
"\n \"obfuscation_type\": ", obfuscation_type, ",",
717-
"\n \"accept_room_invitations\": ", accept_invitations, ",",
718-
"\n \"joined_global_room\": ", joined_global_room, ",",
719-
"\n \"liked_items\": [", liked_items, "],",
720-
"\n \"hated_items\": [", hated_items, "],",
721-
"\n \"joined_rooms\": [", joined_rooms, "],",
722-
"\n \"watched_users\": [", watched_users, "]",
723-
"\n },",
724-
"\n \"persistent_data\": {",
725-
"\n \"admin_until\": ", admin, ",",
726-
"\n \"privileged_until\": ", privileged, ",",
727-
"\n \"supporter\": ", supporter, ",",
728-
"\n \"searchable\": ", searchable, ",",
729-
"\n \"num_files\": ", user.shared_files, ",",
730-
"\n \"num_folders\": ", user.shared_folders, ",",
731-
"\n \"upload_speed\": ", user.upload_speed, ",",
732-
"\n \"private_rooms_owner\": [", rooms_owner, "],",
733-
"\n \"private_rooms_member\": [", rooms_member, "],",
734-
"\n \"private_rooms_operator\": [", rooms_operator, "],",
735-
"\n \"room_tickers\": {",
736-
);
693+
string rooms(bool is_owner = true) {
694+
Appender!string output;
695+
const rooms = is_owner
696+
? server.db.rooms(username) : server.db.rooms(null, username);
697+
if (rooms.length == 0)
698+
return output[];
699+
700+
auto first = true;
701+
foreach (ref room_name ; rooms) {
702+
const owner = server.db.get_room_owner(room_name);
703+
const members = text(
704+
quot,
705+
server.db.room_members!(RoomMemberType.any)(room_name)
706+
.join(j_quot), quot
707+
).replace(d_quot, "");
708+
709+
const operators = text(
710+
quot,
711+
server.db.room_members!(RoomMemberType.operator)(room_name)
712+
.join(j_quot), quot
713+
).replace(d_quot, "");
714+
715+
if (!first) output ~= ",";
716+
output ~= text(
717+
"\n {",
718+
"\n \"room_name\": \"", room_name, "\",",
719+
"\n \"owner\": \"", owner, "\",",
720+
"\n \"members\": [", members, "],",
721+
"\n \"operators\": [", operators, "]",
722+
"\n }"
723+
);
724+
first = false;
725+
}
726+
output ~= "\n ";
727+
return output[];
728+
}
729+
730+
string tickers() {
731+
Appender!string output;
732+
const tickers = server.db.user_tickers!(RoomType.any)(username);
733+
if (tickers.length == 0)
734+
return output[];
737735

738-
const tickers = server.db.user_tickers!(RoomType.any)(username);
739-
if (tickers.length > 0) {
740736
auto first = true;
741737
foreach (ticker ; tickers) {
738+
const name = ticker.room_name;
739+
const content = ticker.content;
740+
742741
if (!first) output ~= ",";
743742
output ~= text(
744-
"\n \"", ticker.room_name, "\": \"",
745-
ticker.content, "\""
743+
"\n {",
744+
"\n \"room_name\": \"", name, "\",",
745+
"\n \"content\": \"", content, "\"",
746+
"\n }"
746747
);
747748
first = false;
748749
}
749750
output ~= "\n ";
751+
return output[];
750752
}
751753

752-
output ~= text(
753-
"}",
754-
"\n },",
755-
"\n \"volatile_data\": {",
756-
"\n \"private_messages_queued\": [",
757-
);
754+
string pms() {
755+
Appender!string output;
756+
const pms = server.get_queued_pms(username);
757+
if (pms.length == 0)
758+
return output[];
758759

759-
const pms = server.get_queued_pms(username);
760-
if (pms.length > 0) {
761760
auto first = true;
762761
foreach (pm ; pms) {
763762
const id = pm.id;
@@ -777,13 +776,42 @@ final class CommandHandler
777776
first = false;
778777
}
779778
output ~= "\n ";
779+
return output[];
780780
}
781781

782-
output ~= text(
783-
"]",
782+
return text(
783+
"{",
784+
"\n \"username\": \"", username, "\",",
785+
"\n \"session_data\": {",
786+
"\n \"status\": \"", status, "\",",
787+
"\n \"client_version\": \"", user.client_version, "\",",
788+
"\n \"ip_address\": \"", user.address.toAddrString ~ "\",",
789+
"\n \"port\": ", user.address.port, ",",
790+
"\n \"obfuscated_port\": ", user.obfuscated_port, ",",
791+
"\n \"obfuscation_type\": ", obfuscation_type, ",",
792+
"\n \"accept_room_invitations\": ", accept_invitations, ",",
793+
"\n \"joined_global_room\": ", joined_global_room, ",",
794+
"\n \"liked_items\": [", liked_items, "],",
795+
"\n \"hated_items\": [", hated_items, "],",
796+
"\n \"joined_rooms\": [", joined_rooms, "],",
797+
"\n \"watched_users\": [", watched_users, "]",
798+
"\n },",
799+
"\n \"persistent_data\": {",
800+
"\n \"admin_until\": ", admin, ",",
801+
"\n \"privileged_until\": ", privileged, ",",
802+
"\n \"supporter\": ", supporter, ",",
803+
"\n \"searchable\": ", searchable, ",",
804+
"\n \"num_files\": ", user.shared_files, ",",
805+
"\n \"num_folders\": ", user.shared_folders, ",",
806+
"\n \"upload_speed\": ", user.upload_speed, ",",
807+
"\n \"private_rooms_owner\": {", rooms, "}",
808+
"\n \"private_rooms_member\": {", rooms(false), "}",
809+
"\n \"room_tickers\": {", tickers, "}",
810+
"\n },",
811+
"\n \"volatile_data\": {",
812+
"\n \"private_messages_queued\": [", pms, "]",
784813
"\n }",
785814
"\n}"
786815
);
787-
return output[];
788816
}
789817
}

src/setup/setup.d

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -630,23 +630,66 @@ final class Setup
630630
db.is_user_unsearchable(username) ? "false" : "true"
631631
);
632632

633-
const rooms_owner = text(
634-
quot, db.rooms(username).join(j_quot), quot
635-
).replace(d_quot, "");
633+
string rooms(bool is_owner = true) {
634+
Appender!string output;
635+
const rooms = is_owner
636+
? db.rooms(username) : db.rooms(null, username);
637+
if (rooms.length == 0)
638+
return output[];
636639

637-
const rooms_member = text(
638-
quot, db.rooms(null, username).join(j_quot), quot
639-
).replace(d_quot, "");
640+
auto first = true;
641+
foreach (ref room_name ; rooms) {
642+
const owner = db.get_room_owner(room_name);
643+
const members = text(
644+
quot, db.room_members!(RoomMemberType.any)(room_name)
645+
.join(j_quot), quot
646+
).replace(d_quot, "");
647+
648+
const operators = text(
649+
quot, db.room_members!(RoomMemberType.operator)(room_name)
650+
.join(j_quot), quot
651+
).replace(d_quot, "");
640652

641-
const rooms_operator = text(
642-
quot, db.rooms(null, username, RoomMemberType.operator)
643-
.join(j_quot), quot
644-
).replace(d_quot, "");
653+
if (!first) output ~= ",";
654+
output ~= text(
655+
"\n {",
656+
"\n \"room_name\": \"", room_name, "\",",
657+
"\n \"owner\": \"", owner, "\",",
658+
"\n \"members\": [", members, "],",
659+
"\n \"operators\": [", operators, "]",
660+
"\n }"
661+
);
662+
first = false;
663+
}
664+
output ~= "\n ";
665+
return output[];
666+
}
645667

646-
const tickers = db.user_tickers!(RoomType.any)(username);
668+
string tickers() {
669+
Appender!string output;
670+
const tickers = db.user_tickers!(RoomType.any)(username);
671+
if (tickers.length == 0)
672+
return output[];
647673

648-
Appender!string output;
649-
output ~= text(
674+
auto first = true;
675+
foreach (ticker ; tickers) {
676+
const name = ticker.room_name;
677+
const content = ticker.content;
678+
679+
if (!first) output ~= ",";
680+
output ~= text(
681+
"\n {",
682+
"\n \"room_name\": \"", name, "\",",
683+
"\n \"content\": \"", content, "\"",
684+
"\n }"
685+
);
686+
first = false;
687+
}
688+
output ~= "\n ";
689+
return output[];
690+
}
691+
692+
writeln(
650693
"\n", bold, username, "'s persistent data in JSON format",
651694
norm, "\n{",
652695
"\n \"username\": \"", username, "\",",
@@ -659,31 +702,12 @@ final class Setup
659702
"\n \"num_files\": ", stats.shared_files, ",",
660703
"\n \"num_folders\": ", stats.shared_folders, ",",
661704
"\n \"upload_speed\": ", stats.upload_speed, ",",
662-
"\n \"private_rooms_owner\": [", rooms_owner, "],",
663-
"\n \"private_rooms_member\": [", rooms_member, "],",
664-
"\n \"private_rooms_operator\": [", rooms_operator, "],",
665-
"\n \"room_tickers\": {",
666-
);
667-
668-
if (tickers.length > 0) {
669-
auto first = true;
670-
foreach (ticker ; tickers) {
671-
if (!first) output ~= ",";
672-
output ~= text(
673-
"\n \"", ticker.room_name, "\": \"",
674-
ticker.content, "\""
675-
);
676-
first = false;
677-
}
678-
output ~= "\n ";
679-
}
680-
681-
output ~= text(
682-
"}",
705+
"\n \"private_rooms_owner\": {", rooms, "}",
706+
"\n \"private_rooms_member\": {", rooms(false), "}",
707+
"\n \"room_tickers\": {", tickers, "}",
683708
"\n }",
684709
"\n}"
685710
);
686-
writeln(output[]);
687711
registered_users();
688712
}
689713

0 commit comments

Comments
 (0)