mirror of
https://github.com/wanderer-industries/wanderer
synced 2025-12-10 17:55:43 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
beb3077159 | ||
|
|
ecb3ca2b4e | ||
|
|
8412e3867d | ||
|
|
90c40100d1 | ||
|
|
92cb49da90 | ||
|
|
abc09c067f | ||
|
|
edbd1e4bbc | ||
|
|
75edb91825 |
36
CHANGELOG.md
36
CHANGELOG.md
@@ -2,6 +2,42 @@
|
||||
|
||||
<!-- changelog -->
|
||||
|
||||
## [v1.59.8](https://github.com/wanderer-industries/wanderer/compare/v1.59.7...v1.59.8) (2025-04-15)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Core: Fixed issues with main character & tracking
|
||||
|
||||
## [v1.59.7](https://github.com/wanderer-industries/wanderer/compare/v1.59.6...v1.59.7) (2025-04-14)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Core: Fixed auto-select splashed systems
|
||||
|
||||
## [v1.59.6](https://github.com/wanderer-industries/wanderer/compare/v1.59.5...v1.59.6) (2025-04-13)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Map: Fix icons of main, follow and shattered (#321)
|
||||
|
||||
## [v1.59.5](https://github.com/wanderer-industries/wanderer/compare/v1.59.4...v1.59.5) (2025-04-12)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Signatures: avoid signatures delete on wrong buffer
|
||||
|
||||
## [v1.59.4](https://github.com/wanderer-industries/wanderer/compare/v1.59.3...v1.59.4) (2025-04-10)
|
||||
|
||||
|
||||
|
||||
@@ -1,38 +1,3 @@
|
||||
.MainCharacter,
|
||||
.FollowingCharacter {
|
||||
&::before, &::after {
|
||||
content: " ";
|
||||
display: inline-block;
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
overflow: hidden;
|
||||
border-radius: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
.MainCharacter {
|
||||
&::before {
|
||||
background-image: url(/images/73_16_247.png);
|
||||
left: 22px;
|
||||
top: 0px;
|
||||
transform: rotateZ(90deg);
|
||||
}
|
||||
}
|
||||
|
||||
.FollowingCharacter {
|
||||
&::after {
|
||||
background-image: url(/images/73_16_241.png);
|
||||
left: 22px;
|
||||
top: 22px;
|
||||
transform: rotateZ(180deg);
|
||||
}
|
||||
}
|
||||
|
||||
.Docked {
|
||||
content: " ";
|
||||
display: inline-block;
|
||||
|
||||
@@ -7,6 +7,7 @@ import { emitMapEvent } from '@/hooks/Mapper/events';
|
||||
import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
|
||||
import classes from './Characters.module.scss';
|
||||
import { isDocked } from '@/hooks/Mapper/helpers/isDocked.ts';
|
||||
import { PrimeIcons } from 'primereact/api';
|
||||
|
||||
interface CharactersProps {
|
||||
data: CharacterTypeRaw[];
|
||||
@@ -34,18 +35,35 @@ export const Characters = ({ data }: CharactersProps) => {
|
||||
>
|
||||
<div
|
||||
className={clsx(
|
||||
'overflow-hidden relative',
|
||||
'flex w-[35px] h-[35px] rounded-[4px] border-[1px] border-solid bg-transparent cursor-pointer',
|
||||
'transition-colors duration-250',
|
||||
{
|
||||
['overflow-hidden relative']: true,
|
||||
['border-stone-800/90']: !character.online,
|
||||
['border-lime-600/70']: character.online,
|
||||
[classes.MainCharacter]: mainCharacterEveId === character.eve_id,
|
||||
[classes.FollowingCharacter]: followingCharacterEveId === character.eve_id,
|
||||
},
|
||||
)}
|
||||
title={character.name}
|
||||
>
|
||||
{mainCharacterEveId === character.eve_id && (
|
||||
<span
|
||||
className={clsx(
|
||||
'absolute top-[2px] left-[22px] w-[9px] h-[9px]',
|
||||
'text-yellow-500 text-[9px] rounded-[1px] z-10',
|
||||
'pi',
|
||||
PrimeIcons.STAR_FILL,
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
{followingCharacterEveId === character.eve_id && (
|
||||
<span
|
||||
className={clsx(
|
||||
'absolute top-[23px] left-[22px] w-[10px] h-[10px]',
|
||||
'text-sky-300 text-[10px] rounded-[1px] z-10',
|
||||
'pi pi-angle-double-right',
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
{isDocked(character.location) && <div className={classes.Docked} />}
|
||||
<div
|
||||
className={clsx(
|
||||
|
||||
@@ -355,3 +355,15 @@ $tooltip-bg: #202020;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ShatteredIcon {
|
||||
position: relative;
|
||||
//top: -1px;
|
||||
left: -1px;
|
||||
|
||||
background-size: 100%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
|
||||
background-image: url(/images/chart-network-svgrepo-com.svg)
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Handle, NodeProps, Position } from 'reactflow';
|
||||
import clsx from 'clsx';
|
||||
import classes from './SolarSystemNodeDefault.module.scss';
|
||||
import { PrimeIcons } from 'primereact/api';
|
||||
import { useLocalCounter, useSolarSystemNode, useNodeKillsCount } from '../../hooks';
|
||||
import { useLocalCounter, useNodeKillsCount, useSolarSystemNode } from '../../hooks';
|
||||
import {
|
||||
EFFECT_BACKGROUND_STYLES,
|
||||
MARKER_BOOKMARK_BG_STYLES,
|
||||
@@ -14,6 +14,8 @@ import { WormholeClassComp } from '@/hooks/Mapper/components/map/components/Worm
|
||||
import { UnsplashedSignature } from '@/hooks/Mapper/components/map/components/UnsplashedSignature';
|
||||
import { LocalCounter } from './SolarSystemLocalCounter';
|
||||
import { KillsCounter } from './SolarSystemKillsCounter';
|
||||
import { TooltipSize } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper/utils.ts';
|
||||
import { TooltipPosition, WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit';
|
||||
|
||||
export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>) => {
|
||||
const nodeVars = useSolarSystemNode(props);
|
||||
@@ -31,8 +33,10 @@ export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>
|
||||
)}
|
||||
|
||||
{nodeVars.isShattered && (
|
||||
<div className={clsx(classes.Bookmark, MARKER_BOOKMARK_BG_STYLES.shattered)}>
|
||||
<span className={clsx('pi pi-chart-pie', classes.icon)} />
|
||||
<div className={clsx(classes.Bookmark, MARKER_BOOKMARK_BG_STYLES.shattered, '!pr-[2px]')}>
|
||||
<WdTooltipWrapper content="Shattered" position={TooltipPosition.top}>
|
||||
<span className={clsx('block w-[10px] h-[10px]', classes.ShatteredIcon)} />
|
||||
</WdTooltipWrapper>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -40,7 +44,7 @@ export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>
|
||||
<KillsCounter
|
||||
killsCount={localKillsCount}
|
||||
systemId={nodeVars.solarSystemId}
|
||||
size="lg"
|
||||
size={TooltipSize.lg}
|
||||
killsActivityType={nodeVars.killsActivityType}
|
||||
className={clsx(classes.Bookmark, MARKER_BOOKMARK_BG_STYLES[nodeVars.killsActivityType!])}
|
||||
>
|
||||
|
||||
@@ -14,6 +14,8 @@ import { WormholeClassComp } from '@/hooks/Mapper/components/map/components/Worm
|
||||
import { UnsplashedSignature } from '@/hooks/Mapper/components/map/components/UnsplashedSignature';
|
||||
import { LocalCounter } from './SolarSystemLocalCounter';
|
||||
import { KillsCounter } from './SolarSystemKillsCounter';
|
||||
import { TooltipPosition, WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit';
|
||||
import { TooltipSize } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper/utils.ts';
|
||||
|
||||
export const SolarSystemNodeTheme = memo((props: NodeProps<MapSolarSystemType>) => {
|
||||
const nodeVars = useSolarSystemNode(props);
|
||||
@@ -31,8 +33,10 @@ export const SolarSystemNodeTheme = memo((props: NodeProps<MapSolarSystemType>)
|
||||
)}
|
||||
|
||||
{nodeVars.isShattered && (
|
||||
<div className={clsx(classes.Bookmark, MARKER_BOOKMARK_BG_STYLES.shattered)}>
|
||||
<span className={clsx('pi pi-chart-pie', classes.icon)} />
|
||||
<div className={clsx(classes.Bookmark, MARKER_BOOKMARK_BG_STYLES.shattered, '!pr-[2px]')}>
|
||||
<WdTooltipWrapper content="Shattered" position={TooltipPosition.top}>
|
||||
<span className={clsx('block w-[10px] h-[10px]', classes.ShatteredIcon)} />
|
||||
</WdTooltipWrapper>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -40,7 +44,7 @@ export const SolarSystemNodeTheme = memo((props: NodeProps<MapSolarSystemType>)
|
||||
<KillsCounter
|
||||
killsCount={localKillsCount}
|
||||
systemId={nodeVars.solarSystemId}
|
||||
size="lg"
|
||||
size={TooltipSize.lg}
|
||||
killsActivityType={nodeVars.killsActivityType}
|
||||
className={clsx(classes.Bookmark, MARKER_BOOKMARK_BG_STYLES[nodeVars.killsActivityType!])}
|
||||
>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import useRefState from 'react-usestateref';
|
||||
import { useMapEventListener } from '@/hooks/Mapper/events';
|
||||
import { parseSignatures } from '@/hooks/Mapper/helpers';
|
||||
import { Commands, ExtendedSystemSignature, SignatureKind } from '@/hooks/Mapper/types';
|
||||
import { OutCommand } from '@/hooks/Mapper/types/mapHandlers';
|
||||
import { parseSignatures } from '@/hooks/Mapper/helpers';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import useRefState from 'react-usestateref';
|
||||
|
||||
import { getActualSigs } from '../helpers';
|
||||
import { useSignatureFetching } from './useSignatureFetching';
|
||||
import { usePendingDeletions } from './usePendingDeletions';
|
||||
import { UseSystemSignaturesDataProps } from './types';
|
||||
import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
|
||||
import { SETTINGS_KEYS } from '@/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/constants.ts';
|
||||
import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
|
||||
import { getActualSigs } from '../helpers';
|
||||
import { UseSystemSignaturesDataProps } from './types';
|
||||
import { usePendingDeletions } from './usePendingDeletions';
|
||||
import { useSignatureFetching } from './useSignatureFetching';
|
||||
|
||||
export const useSystemSignaturesData = ({
|
||||
systemId,
|
||||
@@ -47,6 +47,10 @@ export const useSystemSignaturesData = ({
|
||||
Object.keys(settings).filter(skey => skey in SignatureKind),
|
||||
) as ExtendedSystemSignature[];
|
||||
|
||||
if (incomingSignatures.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentNonPending = lazyDeleteValue
|
||||
? signaturesRef.current.filter(sig => !sig.pendingDeletion)
|
||||
: signaturesRef.current.filter(sig => !sig.pendingDeletion || !sig.pendingAddition);
|
||||
|
||||
@@ -9,23 +9,25 @@ export const useMapInit = () => {
|
||||
const { addSystemStatic } = useLoadSystemStatic({ systems: [] });
|
||||
|
||||
return useCallback(
|
||||
({
|
||||
systems,
|
||||
system_signatures,
|
||||
connections,
|
||||
effects,
|
||||
wormholes,
|
||||
system_static_infos,
|
||||
characters,
|
||||
user_characters,
|
||||
present_characters,
|
||||
hubs,
|
||||
user_permissions,
|
||||
options,
|
||||
is_subscription_active,
|
||||
main_character_eve_id,
|
||||
following_character_eve_id,
|
||||
}: CommandInit) => {
|
||||
(props: CommandInit) => {
|
||||
const {
|
||||
systems,
|
||||
system_signatures,
|
||||
connections,
|
||||
effects,
|
||||
wormholes,
|
||||
system_static_infos,
|
||||
characters,
|
||||
user_characters,
|
||||
present_characters,
|
||||
hubs,
|
||||
user_permissions,
|
||||
options,
|
||||
is_subscription_active,
|
||||
main_character_eve_id,
|
||||
following_character_eve_id,
|
||||
} = props;
|
||||
|
||||
const updateData: Partial<MapRootData> = {};
|
||||
|
||||
if (wormholes) {
|
||||
@@ -87,7 +89,7 @@ export const useMapInit = () => {
|
||||
updateData.mainCharacterEveId = main_character_eve_id;
|
||||
}
|
||||
|
||||
if (following_character_eve_id) {
|
||||
if ('following_character_eve_id' in props) {
|
||||
updateData.followingCharacterEveId = following_character_eve_id;
|
||||
}
|
||||
|
||||
|
||||
7
assets/static/images/chart-network-svgrepo-com.svg
Normal file
7
assets/static/images/chart-network-svgrepo-com.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#ffffff">
|
||||
|
||||
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
|
||||
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -17,6 +17,7 @@ defmodule WandererApp.Api.MapCharacterSettings do
|
||||
define(:read_by_map, action: :read_by_map)
|
||||
define(:by_map_filtered, action: :by_map_filtered)
|
||||
define(:tracked_by_map_filtered, action: :tracked_by_map_filtered)
|
||||
define(:tracked_by_character, action: :tracked_by_character)
|
||||
define(:tracked_by_map_all, action: :tracked_by_map_all)
|
||||
|
||||
define(:track, action: :track)
|
||||
@@ -61,6 +62,11 @@ defmodule WandererApp.Api.MapCharacterSettings do
|
||||
filter(expr(map_id == ^arg(:map_id) and tracked == true))
|
||||
end
|
||||
|
||||
read :tracked_by_character do
|
||||
argument(:character_id, :uuid, allow_nil?: false)
|
||||
filter(expr(character_id == ^arg(:character_id) and tracked == true))
|
||||
end
|
||||
|
||||
update :track do
|
||||
accept [:map_id, :character_id]
|
||||
argument :map_id, :string, allow_nil?: false
|
||||
|
||||
@@ -548,21 +548,12 @@ defmodule WandererApp.Character.Tracker do
|
||||
solar_system_id,
|
||||
structure_id,
|
||||
station_id
|
||||
)
|
||||
do
|
||||
IO.inspect("is_location_updated")
|
||||
IO.inspect(solar_system_id)
|
||||
IO.inspect(new_solar_system_id)
|
||||
IO.inspect(structure_id)
|
||||
IO.inspect(new_structure_id)
|
||||
IO.inspect(station_id)
|
||||
IO.inspect(new_station_id)
|
||||
|
||||
solar_system_id != new_solar_system_id ||
|
||||
),
|
||||
do:
|
||||
solar_system_id != new_solar_system_id ||
|
||||
solar_system_id != new_solar_system_id ||
|
||||
structure_id != new_structure_id ||
|
||||
station_id != new_station_id
|
||||
end
|
||||
|
||||
defp maybe_update_corporation(
|
||||
state,
|
||||
|
||||
@@ -33,7 +33,7 @@ defmodule WandererApp.Esi.ApiClient do
|
||||
|
||||
@cache_opts [cache: true]
|
||||
@retry_opts [max_retries: 1, retry_log_level: :warning]
|
||||
@timeout_opts [receive_timeout: :timer.seconds(30)]
|
||||
@timeout_opts [pool_timeout: 15_000, receive_timeout: :timer.seconds(30)]
|
||||
@api_retry_count 1
|
||||
|
||||
@logger Application.compile_env(:wanderer_app, :logger)
|
||||
@@ -490,7 +490,7 @@ defmodule WandererApp.Esi.ApiClient do
|
||||
try do
|
||||
case Req.get(
|
||||
"#{@base_url}#{path}",
|
||||
api_opts |> with_user_agent_opts() |> with_cache_opts() |> Keyword.merge(@retry_opts)
|
||||
api_opts |> with_user_agent_opts() |> with_cache_opts() |> Keyword.merge(@retry_opts) |> Keyword.merge(@timeout_opts)
|
||||
) do
|
||||
{:ok, %{status: 200, body: body}} ->
|
||||
{:ok, body}
|
||||
|
||||
@@ -70,7 +70,7 @@ defmodule WandererApp.Map.Audit do
|
||||
def track_acl_event(
|
||||
event_type,
|
||||
%{user_id: user_id, acl_id: acl_id} = metadata
|
||||
),
|
||||
) when not is_nil(user_id) and not is_nil(acl_id),
|
||||
do:
|
||||
WandererApp.Api.UserActivity.new(%{
|
||||
user_id: user_id,
|
||||
@@ -85,7 +85,7 @@ defmodule WandererApp.Map.Audit do
|
||||
def track_map_event(
|
||||
event_type,
|
||||
%{character_id: character_id, user_id: user_id, map_id: map_id} = metadata
|
||||
),
|
||||
) when not is_nil(character_id) and not is_nil(user_id) and not is_nil(map_id),
|
||||
do:
|
||||
WandererApp.Api.UserActivity.new(%{
|
||||
character_id: character_id,
|
||||
|
||||
@@ -32,6 +32,7 @@ defmodule WandererApp.Map.Server do
|
||||
map_id
|
||||
|
||||
nil ->
|
||||
WandererApp.Cache.insert("map_#{map_id}:started", false)
|
||||
throw("Map server not started")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -86,6 +86,25 @@ defmodule WandererApp.Map.Server.AclsImpl do
|
||||
end
|
||||
end
|
||||
|
||||
def handle_acl_deleted(map_id, acl_id) do
|
||||
{:ok, map} =
|
||||
WandererApp.MapRepo.get(map_id,
|
||||
acls: [
|
||||
:owner_id,
|
||||
members: [:role, :eve_character_id, :eve_corporation_id, :eve_alliance_id]
|
||||
]
|
||||
)
|
||||
|
||||
WandererApp.Map.update_map(map_id, %{acls: map.acls})
|
||||
|
||||
character_ids =
|
||||
map_id
|
||||
|> WandererApp.Map.get_map!()
|
||||
|> Map.get(:characters, [])
|
||||
|
||||
WandererApp.Cache.insert("map_#{map_id}:invalidate_character_ids", character_ids)
|
||||
end
|
||||
|
||||
def track_acls([]), do: :ok
|
||||
|
||||
def track_acls([acl_id | rest]) do
|
||||
|
||||
@@ -64,6 +64,16 @@ defmodule WandererApp.Map.Server.CharactersImpl do
|
||||
map_tracked_character_ids
|
||||
|> Enum.filter(fn character -> character in tracked_characters end)
|
||||
|
||||
{:ok, old_map_tracked_characters} = WandererApp.Cache.lookup("maps:#{map_id}:tracked_characters", [])
|
||||
characters_to_remove = old_map_tracked_characters -- map_active_tracked_characters
|
||||
|
||||
{:ok, invalidate_character_ids} =
|
||||
WandererApp.Cache.lookup(
|
||||
"map_#{map_id}:invalidate_character_ids",
|
||||
[]
|
||||
)
|
||||
|
||||
WandererApp.Cache.insert("map_#{map_id}:invalidate_character_ids", (invalidate_character_ids ++ characters_to_remove) |> Enum.uniq())
|
||||
WandererApp.Cache.insert("maps:#{map_id}:tracked_characters", map_active_tracked_characters)
|
||||
|
||||
:ok
|
||||
@@ -98,6 +108,9 @@ defmodule WandererApp.Map.Server.CharactersImpl do
|
||||
character_id
|
||||
|> WandererApp.Character.get_character()
|
||||
|> case do
|
||||
{:ok, %{user_id: nil}} ->
|
||||
{:remove_character, character_id}
|
||||
|
||||
{:ok, character} ->
|
||||
[character_permissions] =
|
||||
WandererApp.Permissions.check_characters_access([character], acls)
|
||||
|
||||
@@ -377,12 +377,11 @@ defmodule WandererApp.Map.Server.ConnectionsImpl do
|
||||
Impl.broadcast!(map_id, :add_connection, connection)
|
||||
|
||||
{:ok, character} = WandererApp.Character.get_character(character_id)
|
||||
{:ok, character_with_user} = character |> Ash.load(:user)
|
||||
|
||||
{:ok, _} =
|
||||
WandererApp.User.ActivityTracker.track_map_event(:map_connection_added, %{
|
||||
character_id: character_id,
|
||||
user_id: character_with_user.user_id,
|
||||
user_id: character.user_id,
|
||||
map_id: map_id,
|
||||
solar_system_source_id: old_location.solar_system_id,
|
||||
solar_system_target_id: location.solar_system_id
|
||||
|
||||
@@ -261,6 +261,12 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
state
|
||||
end
|
||||
|
||||
def handle_event({:acl_deleted, %{acl_id: acl_id}}, %{map_id: map_id} = state) do
|
||||
AclsImpl.handle_acl_updated(map_id, acl_id)
|
||||
|
||||
state
|
||||
end
|
||||
|
||||
def handle_event(:cleanup_connections, state) do
|
||||
Process.send_after(self(), :cleanup_connections, @connections_cleanup_timeout)
|
||||
|
||||
@@ -299,7 +305,7 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
%{state | map_opts: map_options(options)}
|
||||
end
|
||||
|
||||
def handle_event({ref, _result}, %{map_id: _map_id} = state) do
|
||||
def handle_event({ref, _result}, %{map_id: _map_id} = state) when is_reference(ref) do
|
||||
Process.demonitor(ref, [:flush])
|
||||
|
||||
state
|
||||
|
||||
@@ -175,10 +175,6 @@ defmodule WandererApp.Zkb.KillsPreloader do
|
||||
reduce_task_result(pass_type, task_result, acc_state, acc_map)
|
||||
end)
|
||||
|
||||
if map_size(kills_map) > 0 do
|
||||
broadcast_all_kills(kills_map, pass_type)
|
||||
end
|
||||
|
||||
final_state
|
||||
end
|
||||
|
||||
@@ -276,22 +272,6 @@ defmodule WandererApp.Zkb.KillsPreloader do
|
||||
defp log_failed_task(:expanded, reason),
|
||||
do: Logger.error("[KillsPreloader] Expanded fetch task failed => #{inspect(reason)}")
|
||||
|
||||
defp broadcast_all_kills(kills_map, pass_type) do
|
||||
Logger.info(
|
||||
"[KillsPreloader] Broadcasting kills => #{map_size(kills_map)} systems (#{pass_type})"
|
||||
)
|
||||
|
||||
Phoenix.PubSub.broadcast!(
|
||||
WandererApp.PubSub,
|
||||
"zkb_preload",
|
||||
%{
|
||||
event: :detailed_kills_updated,
|
||||
payload: kills_map,
|
||||
fetch_type: pass_type
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
defp merge_calls_count(%{calls_count: c1} = st1, %{calls_count: c2}),
|
||||
do: %{st1 | calls_count: c1 + c2}
|
||||
|
||||
|
||||
@@ -64,9 +64,22 @@ defmodule WandererAppWeb.CharactersLive do
|
||||
|
||||
@impl true
|
||||
def handle_event("delete", %{"character_id" => character_id}, socket) do
|
||||
socket.assigns.characters
|
||||
|> Enum.find(&(&1.id == character_id))
|
||||
|> WandererApp.Api.Character.mark_as_deleted!()
|
||||
WandererApp.Character.TrackerManager.stop_tracking(character_id)
|
||||
|
||||
{:ok, map_user_settings} = WandererApp.Api.MapCharacterSettings.tracked_by_character(%{character_id: character_id})
|
||||
|
||||
map_user_settings
|
||||
|> Enum.each(fn settings ->
|
||||
settings
|
||||
|> WandererApp.Api.MapCharacterSettings.untrack()
|
||||
end)
|
||||
|
||||
{:ok, updated_character} =
|
||||
socket.assigns.characters
|
||||
|> Enum.find(&(&1.id == character_id))
|
||||
|> WandererApp.Api.Character.mark_as_deleted()
|
||||
|
||||
WandererApp.Character.update_character(character_id, updated_character)
|
||||
|
||||
{:ok, characters} =
|
||||
WandererApp.Api.Character.active_by_user(%{user_id: socket.assigns.user_id})
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
</div>
|
||||
</.link>
|
||||
<div
|
||||
:for={character <- @characters}
|
||||
:for={character <- @characters |> Enum.sort_by(& &1.name, :asc)}
|
||||
class="card rounded-none bg-gradient-to-l from-stone-950 to-stone-900 hover:text-white transform transition duration-500"
|
||||
>
|
||||
<figure class="avatar">
|
||||
|
||||
@@ -74,12 +74,12 @@ defmodule WandererAppWeb.MapActivityEventHandler do
|
||||
}
|
||||
end)
|
||||
|
||||
{:activity_data, summarized_result}
|
||||
{:character_activity_data, summarized_result}
|
||||
rescue
|
||||
e ->
|
||||
Logger.error("Error processing character activity: #{inspect(e)}")
|
||||
Logger.error("#{Exception.format_stacktrace()}")
|
||||
{:activity_data, []}
|
||||
{:character_activity_data, []}
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
@@ -240,12 +240,19 @@ defmodule WandererAppWeb.MapCharactersEventHandler do
|
||||
{:ok, tracking_data} =
|
||||
WandererApp.Character.TrackingUtils.build_tracking_data(map_id, current_user_id)
|
||||
|
||||
{:ok, main_character_id} =
|
||||
{main_character_id, main_character_eve_id} =
|
||||
WandererApp.Character.TrackingUtils.get_main_character(
|
||||
map_user_settings,
|
||||
current_user_characters,
|
||||
current_user_characters
|
||||
)
|
||||
|> case do
|
||||
{:ok, main_character} when not is_nil(main_character) ->
|
||||
{main_character.id, main_character.eve_id}
|
||||
|
||||
_ ->
|
||||
{nil, nil}
|
||||
end
|
||||
|
||||
Process.send_after(self(), %{event: :refresh_user_characters}, 50)
|
||||
|
||||
@@ -254,7 +261,7 @@ defmodule WandererAppWeb.MapCharactersEventHandler do
|
||||
|> assign(
|
||||
map_user_settings: map_user_settings,
|
||||
main_character_id: main_character_id,
|
||||
main_character_eve_id: character_eve_id
|
||||
main_character_eve_id: main_character_eve_id
|
||||
)}
|
||||
end
|
||||
|
||||
|
||||
@@ -335,12 +335,20 @@ defmodule WandererAppWeb.MapCoreEventHandler do
|
||||
only_tracked_characters
|
||||
)
|
||||
|
||||
{:ok, main_character} =
|
||||
|
||||
{main_character_id, main_character_eve_id} =
|
||||
WandererApp.Character.TrackingUtils.get_main_character(
|
||||
map_user_settings,
|
||||
current_user_characters,
|
||||
available_map_characters
|
||||
)
|
||||
|> case do
|
||||
{:ok, main_character} when not is_nil(main_character) ->
|
||||
{main_character.id, main_character.eve_id}
|
||||
|
||||
_ ->
|
||||
{nil, nil}
|
||||
end
|
||||
|
||||
following_character_eve_id = case map_user_settings do
|
||||
nil -> nil
|
||||
@@ -351,8 +359,8 @@ defmodule WandererAppWeb.MapCoreEventHandler do
|
||||
%{
|
||||
user_permissions: user_permissions,
|
||||
map_user_settings: map_user_settings,
|
||||
main_character_id: main_character.id,
|
||||
main_character_eve_id: main_character.eve_id,
|
||||
main_character_id: main_character_id,
|
||||
main_character_eve_id: main_character_eve_id,
|
||||
following_character_eve_id: following_character_eve_id,
|
||||
tracked_characters: tracked_data.tracked_characters,
|
||||
all_character_tracked?: tracked_data.all_tracked?,
|
||||
|
||||
@@ -45,12 +45,20 @@ defmodule WandererAppWeb.MapKillsEventHandler do
|
||||
)
|
||||
end
|
||||
|
||||
def handle_server_event(%{event: :detailed_kills_updated, payload: payload}, socket) do
|
||||
socket
|
||||
|> MapEventHandler.push_map_event(
|
||||
"detailed_kills_updated",
|
||||
payload
|
||||
)
|
||||
def handle_server_event(%{event: :detailed_kills_updated, payload: payload}, %{
|
||||
assigns: %{
|
||||
map_id: map_id
|
||||
}
|
||||
} = socket) do
|
||||
case WandererApp.Map.is_subscription_active?(map_id) do
|
||||
{:ok, true} ->
|
||||
socket
|
||||
|> MapEventHandler.push_map_event(
|
||||
"detailed_kills_updated",
|
||||
payload
|
||||
)
|
||||
_ -> socket
|
||||
end
|
||||
end
|
||||
|
||||
def handle_server_event(
|
||||
|
||||
@@ -35,14 +35,15 @@ defmodule WandererAppWeb.MapSystemsEventHandler do
|
||||
%{
|
||||
assigns: %{
|
||||
current_user: current_user,
|
||||
tracked_characters: tracked_characters,
|
||||
map_id: map_id,
|
||||
map_user_settings: map_user_settings
|
||||
}
|
||||
} = socket
|
||||
) do
|
||||
character =
|
||||
current_user.characters
|
||||
|> Enum.find(& &1.id)
|
||||
tracked_characters
|
||||
|> Enum.find(fn tracked_character -> tracked_character.id == character_id end)
|
||||
|
||||
is_user_character =
|
||||
not is_nil(character)
|
||||
|
||||
@@ -173,28 +173,10 @@ defmodule WandererAppWeb.MapEventHandler do
|
||||
when event_name in @map_signatures_events,
|
||||
do: MapSignaturesEventHandler.handle_server_event(event, socket)
|
||||
|
||||
def handle_event(
|
||||
%{
|
||||
assigns: %{
|
||||
is_subscription_active?: true
|
||||
}
|
||||
} = socket,
|
||||
%{event: event_name} = event
|
||||
)
|
||||
def handle_event(socket, %{event: event_name} = event)
|
||||
when event_name in @map_kills_events,
|
||||
do: MapKillsEventHandler.handle_server_event(event, socket)
|
||||
|
||||
def handle_event(
|
||||
%{
|
||||
assigns: %{
|
||||
is_subscription_active?: false
|
||||
}
|
||||
} = socket,
|
||||
%{event: event_name} = _event
|
||||
)
|
||||
when event_name in @map_kills_events,
|
||||
do: socket
|
||||
|
||||
def handle_event(socket, {ref, result}) when is_reference(ref) do
|
||||
Process.demonitor(ref, [:flush])
|
||||
|
||||
@@ -203,12 +185,6 @@ defmodule WandererAppWeb.MapEventHandler do
|
||||
Process.send_after(self(), map_error, 100)
|
||||
socket
|
||||
|
||||
{:activity_data, activity_data} ->
|
||||
MapActivityEventHandler.handle_server_event(
|
||||
%{event: :character_activity_data, payload: activity_data},
|
||||
socket
|
||||
)
|
||||
|
||||
{event, payload} ->
|
||||
Process.send_after(
|
||||
self(),
|
||||
@@ -227,11 +203,6 @@ defmodule WandererAppWeb.MapEventHandler do
|
||||
def handle_event(socket, {:DOWN, ref, :process, _pid, reason}) when is_reference(ref) do
|
||||
# Task failed, log the error and update the client
|
||||
Logger.error("Task failed: #{inspect(reason)}")
|
||||
|
||||
MapActivityEventHandler.handle_server_event(
|
||||
%{event: :character_activity_data, payload: []},
|
||||
socket
|
||||
)
|
||||
end
|
||||
|
||||
def handle_event(socket, event),
|
||||
|
||||
Reference in New Issue
Block a user