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)
{
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)
{
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());
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)
{
var ret = new List<RelayDistance>();
var geoRelays = await _database.GeoSearchAsync(RelayPositionKey(), lon, lat, new GeoSearchCircle(radius), count);
var ret = new Dictionary<Uri, RelayDistance>();
var geoRelays =
await _database.GeoSearchAsync(RelayPositionKey(), lon, lat, new GeoSearchCircle(radius), count);
foreach (var gr in geoRelays)
{
var id = ((string)gr.Member!).Split('\x1');
var u = new Uri(id[0]);
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,
Relay = info,
@ -154,7 +159,7 @@ public class RedisStore
}
}
return ret;
return ret.Values.ToList();
}
public async IAsyncEnumerable<string> EnumerateProfiles()
@ -359,4 +364,4 @@ public class RelaySetting
[ProtoMember(3)]
public bool Write { get; init; }
}
}