Skip to content

Commit deb295b

Browse files
committed
Allow referencing user with name and fingerprint
1 parent 52684db commit deb295b

File tree

6 files changed

+70
-13
lines changed

6 files changed

+70
-13
lines changed

api/lib/src/services/user.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22

3+
import 'package:collection/collection.dart';
34
import 'package:dart_mappable/dart_mappable.dart';
45
import 'package:networker/networker.dart';
56
import 'package:setonix_api/event.dart';
@@ -34,6 +35,10 @@ abstract class UserService {
3435
});
3536
}
3637

38+
const kUserReferenceID = '#';
39+
const kUserReferenceName = '@';
40+
const kUserReferenceFingerprint = '*';
41+
3742
final class UserManager {
3843
final Map<Channel, SetonixUser> _users = {};
3944
final String guestPrefix;
@@ -121,4 +126,40 @@ final class UserManager {
121126
_users[channel] = updatedUser;
122127
return true;
123128
}
129+
130+
Future<SetonixUser?> getUserByReference(String reference) async {
131+
if (reference.isEmpty) return null;
132+
switch (reference[0]) {
133+
case kUserReferenceID:
134+
final id = reference.substring(1);
135+
if (id.isEmpty) return null;
136+
final idInt = int.tryParse(id);
137+
if (idInt == null) return null;
138+
return getUser(idInt);
139+
case kUserReferenceName:
140+
final name = reference.substring(1);
141+
return getUserByName(name);
142+
case kUserReferenceFingerprint:
143+
final fingerprint = reference.substring(1);
144+
return service?.getUser(fingerprint);
145+
default:
146+
final id = int.tryParse(reference);
147+
if (id != null) {
148+
return getUser(id);
149+
}
150+
final user = getUserByName(reference);
151+
if (user != null) {
152+
return user;
153+
}
154+
return service?.getUserFromName(reference);
155+
}
156+
}
157+
158+
Future<Channel?> getUserIdByReference(String reference) async {
159+
final user = await getUserByReference(reference);
160+
if (user == null) return null;
161+
return _users.entries.firstWhereOrNull((e) => e.value == user)?.key;
162+
}
163+
164+
Iterable<MapEntry<Channel, SetonixUser>> getUsers() => _users.entries;
124165
}

metadata/en-US/changelogs/8.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
* Upgrade to agb 8.11
2+
* Allow referencing user with name and fingerprint
23
* Fix serverlist route
34

45
Read more here: https://linwood.dev/setonix/0.5.1

plugin/rust/Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/lib/src/programs/kick.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ class KickProgram extends ConsoleProgram {
1111
String getDescription() => "Kick a player";
1212

1313
@override
14-
String getUsage() => 'kick <ID> [<Reason>] [<Link>]';
14+
String getUsage() => 'kick <User> [<Reason>] [<Link>]';
1515

1616
@override
17-
void run(String label, List<String> args) {
17+
Future<void> run(String label, List<String> args) async {
1818
if (args.isEmpty || args.length > 3) {
1919
server.log("Wrong usage, use ${getUsage()}", level: LogLevel.error);
2020
}
21-
final arg = int.tryParse(args[0]);
21+
final arg = await server.userManager.getUserIdByReference(args[0]);
2222
if (arg == null) {
2323
server.log("ID should be a number", level: LogLevel.error);
2424
return;

server/lib/src/programs/players.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ class PlayersProgram extends ConsoleProgram {
1212
@override
1313
void run(String label, List<String> args) {
1414
print("-----");
15-
final players = server.players;
15+
final players = server.userManager.getUsers();
1616
print("${players.length} player(s) connected.");
17-
for (final player in players.entries) {
18-
print("${player.value.address} (${player.key})");
17+
for (final player in players) {
18+
final connectionInfo = server.players[player.key];
19+
print(
20+
"${connectionInfo?.address} | #${player.key}) | @${player.value.name} | *${player.value.fingerprint ?? 'No Fingerprint'}",
21+
);
1922
}
2023
print("-----");
2124
}

server/lib/src/programs/whitelist.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,23 @@ class WhitelistProgram extends ConsoleProgram {
2121
return;
2222
}
2323
final action = args[0].toLowerCase();
24-
final user = args[1];
24+
final user = await server.userManager.getUserByReference(args[1]);
25+
if (user == null) {
26+
server.log("User not found: ${args[1]}", level: LogLevel.error);
27+
return;
28+
}
29+
final fingerprint = user.fingerprint;
30+
if (fingerprint == null) {
31+
server.log(
32+
"User $user does not have a fingerprint. Cannot add to whitelist.",
33+
level: LogLevel.error,
34+
);
35+
return;
36+
}
2537

2638
if (action == 'add') {
2739
final result = await server.userManager.service?.updateUser(
28-
user,
40+
fingerprint,
2941
onWhitelist: true,
3042
);
3143
if (result != true) {
@@ -38,7 +50,7 @@ class WhitelistProgram extends ConsoleProgram {
3850
server.log("User $user added to whitelist", level: LogLevel.info);
3951
} else if (action == 'remove') {
4052
final result = await server.userManager.service?.updateUser(
41-
user,
53+
fingerprint,
4254
onWhitelist: false,
4355
);
4456
if (result != true) {

0 commit comments

Comments
 (0)