fix: remove duplicates from FindCloseRelays

This commit is contained in:
Kieran 2024-03-15 16:29:09 +00:00
parent 7ad353fdcd
commit 4ec40984d6

View File

@ -95,13 +95,17 @@ public class RedisStore
if ((old?.Created ?? 0) < relays.Created) if ((old?.Created ?? 0) < relays.Created)
{ {
var removed = old?.Relays.Where(a => relays.Relays.All(b => b.Url != a.Url)); var removed = old?.Relays.Where(a => relays.Relays.All(b => b.Url != a.Url));
var added = old == default ? relays.Relays : relays.Relays.Where(a => old.Relays.All(b => b.Url != a.Url)).ToList(); var added = old == default
? relays.Relays
: relays.Relays.Where(a => old.Relays.All(b => b.Url != a.Url)).ToList();
if (removed != default) if (removed != default)
{ {
await Task.WhenAll(removed.Select(a => _database.SetRemoveAsync(RelayUsersKey(a.Url), Convert.FromHexString(pubkey)))); await Task.WhenAll(removed.Select(a =>
_database.SetRemoveAsync(RelayUsersKey(a.Url), Convert.FromHexString(pubkey))));
} }
await Task.WhenAll(added.Select(a => _database.SetAddAsync(RelayUsersKey(a.Url), Convert.FromHexString(pubkey)))); await Task.WhenAll(added.Select(a =>
_database.SetAddAsync(RelayUsersKey(a.Url), Convert.FromHexString(pubkey))));
await _database.SetAddAsync("relays", added.Select(a => (RedisValue)a.Url.ToString()).ToArray()); await _database.SetAddAsync("relays", added.Select(a => (RedisValue)a.Url.ToString()).ToArray());
return await _database.SetAsync(UserRelaysKey(pubkey), relays, DefaultExpire); return await _database.SetAsync(UserRelaysKey(pubkey), relays, DefaultExpire);
@ -136,16 +140,17 @@ public class RedisStore
public async Task<List<RelayDistance>> FindCloseRelays(double lat, double lon, int radius = 50_000, int count = 10) public async Task<List<RelayDistance>> FindCloseRelays(double lat, double lon, int radius = 50_000, int count = 10)
{ {
var ret = new List<RelayDistance>(); var ret = new Dictionary<Uri, RelayDistance>();
var geoRelays = await _database.GeoSearchAsync(RelayPositionKey(), lon, lat, new GeoSearchCircle(radius), count); var geoRelays =
await _database.GeoSearchAsync(RelayPositionKey(), lon, lat, new GeoSearchCircle(radius), count);
foreach (var gr in geoRelays) foreach (var gr in geoRelays)
{ {
var id = ((string)gr.Member!).Split('\x1'); var id = ((string)gr.Member!).Split('\x1');
var u = new Uri(id[0]); var u = new Uri(id[0]);
var info = await GetRelay(u); var info = await GetRelay(u);
if (info != default) if (info != default && !ret.ContainsKey(u))
{ {
ret.Add(new() ret.Add(u, new()
{ {
Distance = gr.Distance.HasValue ? (long)gr.Distance.Value : 0, Distance = gr.Distance.HasValue ? (long)gr.Distance.Value : 0,
Relay = info, Relay = info,
@ -154,7 +159,7 @@ public class RedisStore
} }
} }
return ret; return ret.Values.ToList();
} }
public async IAsyncEnumerable<string> EnumerateProfiles() public async IAsyncEnumerable<string> EnumerateProfiles()