aa-killtracker 0.17.0__tar.gz → 0.18.0a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/PKG-INFO +1 -1
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/__init__.py +1 -1
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/admin.py +13 -8
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/app_settings.py +7 -4
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/apps.py +2 -4
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/core/discord_messages.py +129 -55
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/core/killmails.py +92 -59
- aa_killtracker-0.18.0a2/killtracker/core/worker_shutdown.py +47 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/forms.py +1 -1
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/managers.py +3 -3
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/models/trackers.py +5 -7
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/models/webhooks.py +71 -90
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/providers.py +1 -1
- aa_killtracker-0.18.0a2/killtracker/signals.py +31 -0
- aa_killtracker-0.18.0a2/killtracker/tasks.py +282 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/core/test_discord_messages_1.py +54 -7
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/core/test_discord_messages_2.py +8 -8
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/core/test_killmails.py +74 -29
- aa_killtracker-0.18.0a2/killtracker/tests/core/test_worker_shutdown.py +34 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/models/test_trackers_1.py +23 -23
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/models/test_trackers_2.py +5 -4
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/models/test_webhook.py +54 -40
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/test_integration.py +2 -2
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/test_tasks.py +107 -48
- aa_killtracker-0.18.0a2/killtracker/tests/utils.py +16 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/pyproject.toml +5 -2
- aa_killtracker-0.17.0/killtracker/tasks.py +0 -231
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/LICENSE +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/README.md +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/checks.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/constants.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/core/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/exceptions.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/management/commands/killtracker_load_eve.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0001_initial_new.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0001_squashed_all.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0002_fix_webhook_notes_field.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0002_tracker_require_attackers_weapon_groups_and_more.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0003_add_state_clauses.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0003_optimize_tracker_form.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0004_add_faction_clauses.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0004_django4_update.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0005_add_final_blow_clause_and_more.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0006_evetypeplus.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0007_restructure_killsmails.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0008_copy_data_to_new_structure.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/0009_remove_old_models.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/migrations/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/models/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/models/killmails.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/static/killtracker/killtracker_logo.png +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/static/killtracker/zkb_icon.png +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/templates/admin/killtracker/tracker/killmail_test.html +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/core/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/models/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/models/test_killmails.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/test_admin.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/test_admin_2.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/test_exceptions.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/__init__.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/create_eveuniverse.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/evealliances.json +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/evecorporations.json +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/eveentities.json +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/eveuniverse.json +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/factories.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/helpers.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/killmails.json +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tests/testdata/load_eveuniverse.py +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tools/drop_tables_killtracker.sql +0 -0
- {aa_killtracker-0.17.0 → aa_killtracker-0.18.0a2}/killtracker/tools/generate_conditions_text.py +0 -0
@@ -4,16 +4,21 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
from django.contrib import admin
|
7
|
+
from django.db.models import QuerySet
|
7
8
|
from django.http import HttpResponseRedirect
|
8
9
|
from django.shortcuts import render
|
9
10
|
from django.utils.safestring import mark_safe
|
10
11
|
|
11
12
|
from allianceauth import NAME as site_header
|
12
13
|
|
13
|
-
from
|
14
|
-
from .core.killmails import Killmail
|
15
|
-
from .forms import
|
16
|
-
|
14
|
+
from killtracker import tasks
|
15
|
+
from killtracker.core.killmails import Killmail
|
16
|
+
from killtracker.forms import (
|
17
|
+
TrackerAdminForm,
|
18
|
+
TrackerAdminKillmailIdForm,
|
19
|
+
field_nice_display,
|
20
|
+
)
|
21
|
+
from killtracker.models import EveKillmail, EveKillmailAttacker, Tracker, Webhook
|
17
22
|
|
18
23
|
|
19
24
|
class EveKillmailAttackerInline(admin.TabularInline):
|
@@ -46,17 +51,17 @@ class WebhookAdmin(admin.ModelAdmin):
|
|
46
51
|
list_filter = ("is_enabled",)
|
47
52
|
ordering = ("name",)
|
48
53
|
|
49
|
-
def _messages_in_queue(self, obj):
|
50
|
-
return obj.
|
54
|
+
def _messages_in_queue(self, obj: Webhook):
|
55
|
+
return obj.messages_queued()
|
51
56
|
|
52
57
|
actions = ["send_test_message", "purge_messages"]
|
53
58
|
|
54
59
|
@admin.display(description="Purge queued messages of selected webhooks")
|
55
|
-
def purge_messages(self, request, queryset):
|
60
|
+
def purge_messages(self, request, queryset: QuerySet[Webhook]):
|
56
61
|
actions_count = 0
|
57
62
|
killmails_deleted = 0
|
58
63
|
for webhook in queryset:
|
59
|
-
killmails_deleted += webhook.
|
64
|
+
killmails_deleted += webhook.delete_queued_messages()
|
60
65
|
actions_count += 1
|
61
66
|
self.message_user(
|
62
67
|
request,
|
@@ -6,7 +6,7 @@ KILLTRACKER_REDISQ_LOCK_TIMEOUT = clean_setting("KILLTRACKER_REDISQ_LOCK_TIMEOUT
|
|
6
6
|
"""Timeout for lock to ensure atomic access to ZKB RedisQ."""
|
7
7
|
|
8
8
|
KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER = clean_setting(
|
9
|
-
"KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER",
|
9
|
+
"KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER", 600
|
10
10
|
)
|
11
11
|
"""Ignore killmails that are older than the given number in minutes
|
12
12
|
sometimes killmails appear belated on ZKB,
|
@@ -14,7 +14,7 @@ this feature ensures they don't create new alerts.
|
|
14
14
|
"""
|
15
15
|
|
16
16
|
KILLTRACKER_MAX_KILLMAILS_PER_RUN = clean_setting(
|
17
|
-
"KILLTRACKER_MAX_KILLMAILS_PER_RUN",
|
17
|
+
"KILLTRACKER_MAX_KILLMAILS_PER_RUN", 500
|
18
18
|
)
|
19
19
|
"""Maximum number of killmails retrieved from ZKB by task run."""
|
20
20
|
|
@@ -62,11 +62,14 @@ when creating trackers.
|
|
62
62
|
#####################
|
63
63
|
# INTERNAL SETTINGS
|
64
64
|
|
65
|
-
KILLTRACKER_REDISQ_TTW = clean_setting("KILLTRACKER_REDISQ_TTW",
|
65
|
+
KILLTRACKER_REDISQ_TTW = clean_setting("KILLTRACKER_REDISQ_TTW", 1)
|
66
66
|
"""Max duration to wait for new killmails from redisq in seconds."""
|
67
67
|
|
68
68
|
KILLTRACKER_TASKS_TIMEOUT = clean_setting("KILLTRACKER_TASKS_TIMEOUT", 1_800)
|
69
|
-
"""Tasks hard timeout."""
|
69
|
+
"""Tasks hard timeout in seconds."""
|
70
|
+
|
71
|
+
KILLTRACKER_RUN_TIMEOUT = clean_setting("KILLTRACKER_RUN_TIMEOUT", 55)
|
72
|
+
"""Timeout for killtracker run in seconds."""
|
70
73
|
|
71
74
|
KILLTRACKER_DISCORD_SEND_DELAY = clean_setting(
|
72
75
|
"KILLTRACKER_DISCORD_SEND_DELAY", default_value=2, min_value=1, max_value=900
|
@@ -9,7 +9,5 @@ class KillmailsConfig(AppConfig):
|
|
9
9
|
verbose_name = f"Killtracker v{__version__}"
|
10
10
|
|
11
11
|
def ready(self) -> None:
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
Killmail.reset_lock_key()
|
12
|
+
import killtracker.checks # noqa: F401 pylint: disable=unused-import
|
13
|
+
import killtracker.signals # noqa: F401 pylint: disable=unused-import
|
@@ -1,6 +1,11 @@
|
|
1
|
-
"""
|
1
|
+
"""This module allows to create Discord messages from killmails."""
|
2
2
|
|
3
|
-
from
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import json
|
6
|
+
from copy import copy
|
7
|
+
from dataclasses import dataclass
|
8
|
+
from typing import TYPE_CHECKING, List, Optional
|
4
9
|
|
5
10
|
import dhooks_lite
|
6
11
|
from requests.exceptions import HTTPError
|
@@ -11,38 +16,116 @@ from eveuniverse.models import EveEntity, EveSolarSystem
|
|
11
16
|
from allianceauth.eveonline.evelinks import dotlan, eveimageserver, zkillboard
|
12
17
|
from allianceauth.services.hooks import get_extension_logger
|
13
18
|
from app_utils.django import app_labels
|
19
|
+
from app_utils.json import JSONDateTimeDecoder, JSONDateTimeEncoder
|
14
20
|
from app_utils.logging import LoggerAddTag
|
15
21
|
from app_utils.urls import static_file_absolute_url
|
16
22
|
from app_utils.views import humanize_value
|
17
23
|
|
18
24
|
from killtracker import __title__
|
19
|
-
from killtracker.models import Tracker
|
20
25
|
|
21
26
|
from .killmails import ZKB_KILLMAIL_BASEURL, Killmail, TrackerInfo
|
22
27
|
|
23
|
-
|
28
|
+
if TYPE_CHECKING:
|
29
|
+
from killtracker.models import Tracker
|
30
|
+
|
31
|
+
|
32
|
+
_ICON_SIZE = 128
|
24
33
|
|
25
34
|
|
26
35
|
logger = LoggerAddTag(get_extension_logger(__name__), __title__)
|
27
36
|
|
28
37
|
|
29
|
-
|
38
|
+
@dataclass
|
39
|
+
class DiscordMessage:
|
40
|
+
"""A Discord message created from a Killmail."""
|
41
|
+
|
42
|
+
avatar_url: Optional[str] = None
|
43
|
+
content: Optional[str] = None
|
44
|
+
embeds: Optional[List[dhooks_lite.Embed]] = None
|
45
|
+
killmail_id: int = 0 # Killmail ID this message from created from
|
46
|
+
tts: Optional[bool] = None
|
47
|
+
username: Optional[str] = None
|
48
|
+
|
49
|
+
def __post_init__(self):
|
50
|
+
if not self.content and not self.embeds:
|
51
|
+
raise ValueError("Message must have content or embeds to be valid")
|
52
|
+
|
53
|
+
def to_json(self) -> str:
|
54
|
+
"""Converts a Discord message into a JSON object and returns it."""
|
55
|
+
|
56
|
+
if self.embeds:
|
57
|
+
embeds_list = [obj.asdict() for obj in self.embeds]
|
58
|
+
else:
|
59
|
+
embeds_list = None
|
60
|
+
|
61
|
+
message = {}
|
62
|
+
if self.killmail_id:
|
63
|
+
message["killmail_id"] = self.killmail_id
|
64
|
+
if self.content:
|
65
|
+
message["content"] = self.content
|
66
|
+
if embeds_list:
|
67
|
+
message["embeds"] = embeds_list
|
68
|
+
if self.tts:
|
69
|
+
message["tts"] = self.tts
|
70
|
+
if self.username:
|
71
|
+
message["username"] = self.username
|
72
|
+
if self.avatar_url:
|
73
|
+
message["avatar_url"] = self.avatar_url
|
74
|
+
|
75
|
+
return json.dumps(message, cls=JSONDateTimeEncoder)
|
76
|
+
|
77
|
+
@classmethod
|
78
|
+
def from_json(cls, s: str) -> "DiscordMessage":
|
79
|
+
"""Creates a DiscordMessage object from an JSON object and returns it."""
|
80
|
+
message1: dict = json.loads(s, cls=JSONDateTimeDecoder)
|
81
|
+
message2 = copy(message1)
|
82
|
+
if message1.get("embeds"):
|
83
|
+
message2["embeds"] = [
|
84
|
+
dhooks_lite.Embed.from_dict(embed_dict)
|
85
|
+
for embed_dict in message1.get("embeds")
|
86
|
+
]
|
87
|
+
else:
|
88
|
+
message2["embeds"] = None
|
89
|
+
return cls(**message2)
|
90
|
+
|
91
|
+
@classmethod
|
92
|
+
def from_killmail(
|
93
|
+
cls, tracker: Tracker, killmail: Killmail, intro_text: Optional[str] = None
|
94
|
+
) -> "DiscordMessage":
|
95
|
+
"""Creates a DiscordMessage object from a Killmail and returns it."""
|
96
|
+
m = DiscordMessage(
|
97
|
+
killmail_id=killmail.id,
|
98
|
+
content=_create_content(tracker, intro_text),
|
99
|
+
embeds=[_create_embed(tracker, killmail)],
|
100
|
+
)
|
101
|
+
return m
|
102
|
+
|
103
|
+
|
104
|
+
@dataclass(frozen=True)
|
105
|
+
class _MainOrgInfo:
|
30
106
|
"""Infos about a main organization."""
|
31
107
|
|
32
|
-
|
108
|
+
icon_url: str = ""
|
33
109
|
name: str = ""
|
34
|
-
icon_url: str = eveimageserver.alliance_logo_url(1, size=ICON_SIZE)
|
35
110
|
show_as_fleet_kill: bool = False
|
111
|
+
text: str = ""
|
112
|
+
|
113
|
+
def __post_init__(self):
|
114
|
+
if self.icon_url == "":
|
115
|
+
icon_url = eveimageserver.alliance_logo_url(1, size=_ICON_SIZE)
|
116
|
+
object.__setattr__(self, "icon_url", icon_url)
|
36
117
|
|
37
118
|
|
38
|
-
|
119
|
+
@dataclass(frozen=True)
|
120
|
+
class _FinalAttackerInfo:
|
39
121
|
"""Infos about the final attacker on a killmail."""
|
40
122
|
|
41
123
|
name: str = ""
|
42
124
|
ship_type: str = ""
|
43
125
|
|
44
126
|
|
45
|
-
|
127
|
+
@dataclass(frozen=True)
|
128
|
+
class _VictimInfo:
|
46
129
|
"""Infos about the victim of a killmail."""
|
47
130
|
|
48
131
|
name: str
|
@@ -53,9 +136,11 @@ class VictimInfo(NamedTuple):
|
|
53
136
|
ship_type_icon_url: str
|
54
137
|
|
55
138
|
|
56
|
-
def
|
139
|
+
def _create_content(tracker: Tracker, intro_text: Optional[str] = None) -> str:
|
57
140
|
"""Create content for Discord message for a killmail."""
|
58
141
|
|
142
|
+
from killtracker.models import Tracker
|
143
|
+
|
59
144
|
intro_parts = []
|
60
145
|
|
61
146
|
if tracker.ping_type == Tracker.ChannelPingType.EVERYBODY:
|
@@ -102,7 +187,7 @@ def _import_discord_user():
|
|
102
187
|
return DiscordUser
|
103
188
|
|
104
189
|
|
105
|
-
def
|
190
|
+
def _create_embed(tracker: Tracker, killmail: Killmail) -> dhooks_lite.Embed:
|
106
191
|
"""Create Discord embed for a killmail."""
|
107
192
|
|
108
193
|
resolver: EveEntityNameResolver = EveEntity.objects.bulk_resolve_names( # type: ignore
|
@@ -111,7 +196,7 @@ def create_embed(tracker: Tracker, killmail: Killmail) -> dhooks_lite.Embed:
|
|
111
196
|
|
112
197
|
# self info
|
113
198
|
distance_text = ""
|
114
|
-
main_org =
|
199
|
+
main_org = _MainOrgInfo()
|
115
200
|
main_ship_group_text = ""
|
116
201
|
tracked_ship_types_text = ""
|
117
202
|
|
@@ -137,10 +222,24 @@ def create_embed(tracker: Tracker, killmail: Killmail) -> dhooks_lite.Embed:
|
|
137
222
|
title = _calc_title(killmail, resolver, main_org, victim)
|
138
223
|
thumbnail_url = _calc_thumbnail_url(victim, main_org)
|
139
224
|
|
140
|
-
|
225
|
+
author = _calc_author(victim)
|
226
|
+
zkb_icon_url = static_file_absolute_url("killtracker/zkb_icon.png")
|
227
|
+
embed_color = int(tracker.color[1:], 16) if tracker and tracker.color else None
|
141
228
|
|
229
|
+
embed = dhooks_lite.Embed(
|
230
|
+
author=author,
|
231
|
+
description=description,
|
232
|
+
title=title,
|
233
|
+
url=f"{ZKB_KILLMAIL_BASEURL}{killmail.id}/",
|
234
|
+
thumbnail=dhooks_lite.Thumbnail(url=thumbnail_url),
|
235
|
+
footer=dhooks_lite.Footer(text="zKillboard", icon_url=zkb_icon_url),
|
236
|
+
timestamp=killmail.time,
|
237
|
+
color=embed_color,
|
238
|
+
)
|
239
|
+
return embed
|
142
240
|
|
143
|
-
|
241
|
+
|
242
|
+
def _calc_author(victim: _VictimInfo):
|
144
243
|
# TODO This is a workaround for Embed.Author.name. Address in dhooks_lite
|
145
244
|
return (
|
146
245
|
dhooks_lite.Author(
|
@@ -158,10 +257,10 @@ def _calc_description(
|
|
158
257
|
killmail: Killmail,
|
159
258
|
resolver: EveEntityNameResolver,
|
160
259
|
distance_text: str,
|
161
|
-
main_org:
|
260
|
+
main_org: _MainOrgInfo,
|
162
261
|
main_ship_group_text: str,
|
163
262
|
tracked_ship_types_text: str,
|
164
|
-
victim:
|
263
|
+
victim: _VictimInfo,
|
165
264
|
):
|
166
265
|
solar_system_text = _calc_solar_system(tracker, killmail)
|
167
266
|
total_value = (
|
@@ -186,18 +285,18 @@ def _calc_description(
|
|
186
285
|
|
187
286
|
def _calc_victim(
|
188
287
|
tracker: Tracker, killmail: Killmail, resolver: EveEntityNameResolver
|
189
|
-
) ->
|
288
|
+
) -> _VictimInfo:
|
190
289
|
if killmail.victim.alliance_id:
|
191
290
|
victim_organization = resolver.to_name(killmail.victim.alliance_id)
|
192
291
|
victim_org_url = zkillboard.alliance_url(killmail.victim.alliance_id)
|
193
292
|
victim_org_icon_url = eveimageserver.alliance_logo_url(
|
194
|
-
killmail.victim.alliance_id, size=
|
293
|
+
killmail.victim.alliance_id, size=_ICON_SIZE
|
195
294
|
)
|
196
295
|
elif killmail.victim.corporation_id:
|
197
296
|
victim_organization = resolver.to_name(killmail.victim.corporation_id)
|
198
297
|
victim_org_url = zkillboard.corporation_url(killmail.victim.corporation_id)
|
199
298
|
victim_org_icon_url = eveimageserver.corporation_logo_url(
|
200
|
-
killmail.victim.corporation_id, size=
|
299
|
+
killmail.victim.corporation_id, size=_ICON_SIZE
|
201
300
|
)
|
202
301
|
else:
|
203
302
|
victim_organization = ""
|
@@ -229,12 +328,12 @@ def _calc_victim(
|
|
229
328
|
ship_type = resolver.to_name(ship_type_id) if ship_type_id else ""
|
230
329
|
|
231
330
|
ship_type_icon_url = (
|
232
|
-
eveimageserver.type_icon_url(ship_type_id, size=
|
331
|
+
eveimageserver.type_icon_url(ship_type_id, size=_ICON_SIZE)
|
233
332
|
if ship_type_id
|
234
333
|
else ""
|
235
334
|
)
|
236
335
|
|
237
|
-
return
|
336
|
+
return _VictimInfo(
|
238
337
|
organization=victim_organization,
|
239
338
|
org_url=victim_org_url,
|
240
339
|
org_icon_url=victim_org_icon_url,
|
@@ -246,7 +345,7 @@ def _calc_victim(
|
|
246
345
|
|
247
346
|
def _calc_final_attacker(
|
248
347
|
tracker: Tracker, killmail: Killmail, resolver: EveEntityNameResolver
|
249
|
-
) ->
|
348
|
+
) -> _FinalAttackerInfo:
|
250
349
|
for attacker in killmail.attackers:
|
251
350
|
if attacker.is_final_blow:
|
252
351
|
final_attacker = attacker
|
@@ -255,7 +354,7 @@ def _calc_final_attacker(
|
|
255
354
|
final_attacker = None
|
256
355
|
|
257
356
|
if not final_attacker:
|
258
|
-
return
|
357
|
+
return _FinalAttackerInfo()
|
259
358
|
|
260
359
|
if final_attacker.corporation_id:
|
261
360
|
final_attacker_corporation_zkb_link = _corporation_zkb_link(
|
@@ -286,7 +385,7 @@ def _calc_final_attacker(
|
|
286
385
|
|
287
386
|
ship_type = resolver.to_name(ship_type_id) if ship_type_id else ""
|
288
387
|
|
289
|
-
return
|
388
|
+
return _FinalAttackerInfo(name=final_attacker_str, ship_type=ship_type)
|
290
389
|
|
291
390
|
|
292
391
|
def _calc_solar_system(tracker: Tracker, killmail: Killmail):
|
@@ -338,12 +437,12 @@ def _calc_main_group(
|
|
338
437
|
if main_org_entity.is_corporation:
|
339
438
|
main_org_link = _corporation_zkb_link(tracker, main_org_entity.id, resolver)
|
340
439
|
main_org_icon_url = eveimageserver.corporation_logo_url(
|
341
|
-
main_org_entity.id, size=
|
440
|
+
main_org_entity.id, size=_ICON_SIZE
|
342
441
|
)
|
343
442
|
else:
|
344
443
|
main_org_link = _alliance_zkb_link(tracker, main_org_entity.id, resolver)
|
345
444
|
main_org_icon_url = eveimageserver.alliance_logo_url(
|
346
|
-
main_org_entity.id, size=
|
445
|
+
main_org_entity.id, size=_ICON_SIZE
|
347
446
|
)
|
348
447
|
main_org_text = f" | Main group: {main_org_link} ({main_org_entity.count})"
|
349
448
|
show_as_fleet_kill = tracker.identify_fleets
|
@@ -351,7 +450,7 @@ def _calc_main_group(
|
|
351
450
|
show_as_fleet_kill = False
|
352
451
|
main_org_text = main_org_name = main_org_icon_url = ""
|
353
452
|
|
354
|
-
return
|
453
|
+
return _MainOrgInfo(
|
355
454
|
text=main_org_text,
|
356
455
|
name=main_org_name,
|
357
456
|
icon_url=main_org_icon_url,
|
@@ -380,7 +479,7 @@ def _calc_tracked_ship_types(
|
|
380
479
|
return f"\nTracked ship types involved: **{ship_types_text}**"
|
381
480
|
|
382
481
|
|
383
|
-
def _calc_thumbnail_url(victim:
|
482
|
+
def _calc_thumbnail_url(victim: _VictimInfo, main_org: _MainOrgInfo):
|
384
483
|
if main_org.show_as_fleet_kill:
|
385
484
|
return main_org.icon_url
|
386
485
|
|
@@ -390,8 +489,8 @@ def _calc_thumbnail_url(victim: VictimInfo, main_org: MainOrgInfo):
|
|
390
489
|
def _calc_title(
|
391
490
|
killmail: Killmail,
|
392
491
|
resolver: EveEntityNameResolver,
|
393
|
-
main_org:
|
394
|
-
victim:
|
492
|
+
main_org: _MainOrgInfo,
|
493
|
+
victim: _VictimInfo,
|
395
494
|
):
|
396
495
|
solar_system_name = (
|
397
496
|
resolver.to_name(killmail.solar_system_id) if killmail.solar_system_id else ""
|
@@ -403,31 +502,6 @@ def _calc_title(
|
|
403
502
|
return f"{solar_system_name} | {victim.ship_type} | Killmail"
|
404
503
|
|
405
504
|
|
406
|
-
def _create_embed(
|
407
|
-
killmail: Killmail,
|
408
|
-
tracker: Tracker,
|
409
|
-
victim: VictimInfo,
|
410
|
-
description: str,
|
411
|
-
title: str,
|
412
|
-
thumbnail_url: str,
|
413
|
-
):
|
414
|
-
author = _calc_author(victim)
|
415
|
-
zkb_icon_url = static_file_absolute_url("killtracker/zkb_icon.png")
|
416
|
-
embed_color = int(tracker.color[1:], 16) if tracker and tracker.color else None
|
417
|
-
|
418
|
-
embed = dhooks_lite.Embed(
|
419
|
-
author=author,
|
420
|
-
description=description,
|
421
|
-
title=title,
|
422
|
-
url=f"{ZKB_KILLMAIL_BASEURL}{killmail.id}/",
|
423
|
-
thumbnail=dhooks_lite.Thumbnail(url=thumbnail_url),
|
424
|
-
footer=dhooks_lite.Footer(text="zKillboard", icon_url=zkb_icon_url),
|
425
|
-
timestamp=killmail.time,
|
426
|
-
color=embed_color,
|
427
|
-
)
|
428
|
-
return embed
|
429
|
-
|
430
|
-
|
431
505
|
def _character_zkb_link(
|
432
506
|
tracker: Tracker, entity_id: int, resolver: EveEntityNameResolver
|
433
507
|
) -> str:
|