aa-killtracker 0.17.0__py3-none-any.whl → 0.18.0a2__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aa-killtracker
3
- Version: 0.17.0
3
+ Version: 0.18.0a2
4
4
  Summary: An app for running killmail trackers with Alliance Auth and Discord.
5
5
  Author-email: Erik Kalkoken <kalkoken87@gmail.com>
6
6
  Requires-Python: >=3.8
@@ -1,17 +1,19 @@
1
- killtracker/__init__.py,sha256=g8DgOYglXz6Q4YuXHKdw2HdUBMexl4BSn7RbdC-hnGo,355
2
- killtracker/admin.py,sha256=s_O86Ct4prno0cQJE8otumCEqgkZ7H3Q_GFptEOTI_c,14103
3
- killtracker/app_settings.py,sha256=8owiemErRDKxkYY4XB0vFHTI9EqRMjz2SZGTTsEA2ao,3886
4
- killtracker/apps.py,sha256=yYOv4_T_eIiK5M7gr9Dre20WaNQXRKYOdfKyrforNhM,380
1
+ killtracker/__init__.py,sha256=6BDL-xJ19nYjor-SkiCJL5oH0bqet4neHQ2sXqb_Hm8,357
2
+ killtracker/admin.py,sha256=HkpfXq0KhqgLjt4kpe8PigonZ-5_ZKQ6D-Z_l3b3jB0,14235
3
+ killtracker/app_settings.py,sha256=lJ0T86Nmh2dP050mM5hu-OfqIhjic_H5GveYAAKWI3c,4016
4
+ killtracker/apps.py,sha256=lWolk2CVEHPNIMEylbK2fSuCSTRW1n6LBmiDjLoqqq4,384
5
5
  killtracker/checks.py,sha256=ytqWlhIbCsvGKi3xFbUvAZzbUlgOhiOrB67PZ2WfxM4,1311
6
6
  killtracker/constants.py,sha256=W7-VARE3B4_sdzV_9k7qunUzlxTcdSAeSp_ZJVnbUhw,2514
7
7
  killtracker/exceptions.py,sha256=aFY6qxQOta1V-qvgKp19Cgy6M16O7Si8moc2205OsX0,846
8
- killtracker/forms.py,sha256=BqJYcAQ9jbZxTkDsHxrxj0qKKTIGIW0mShbBYdCDlaA,5182
9
- killtracker/managers.py,sha256=JCrfc3yrKD4uHCfIzPu7y2HF-VIJm1yskdc-CFEf7V4,4390
10
- killtracker/providers.py,sha256=smkZe_rKHkZeWFzJ0RhIhJVcbrZUpLYR5fKCge-dpXY,348
11
- killtracker/tasks.py,sha256=GNdX1BGTWgR_wD_Eep6ibPHqC-PFIeVXDiyIJE7vW-E,8109
8
+ killtracker/forms.py,sha256=SUM0U-Sa6FPcGVpsYJbVxHfEtf7hb1Qc_l92Zfa1OLk,5193
9
+ killtracker/managers.py,sha256=lufSPdNrU7KXLfhwvFU82hEsBH--eNMSlCVlFuZYYuI,4422
10
+ killtracker/providers.py,sha256=3DiOlklBq5kLGDV9nMlMbP2-S8AodNgR6gtB4cWWCUo,358
11
+ killtracker/signals.py,sha256=IgULFrfq7m6-glWGyWisNjnom9_q40-XK56Yld1lNi8,906
12
+ killtracker/tasks.py,sha256=sIZsWrJM8QR2aDXEmjH8u_FT8gjzqlKifaQoTPSxnXo,9208
12
13
  killtracker/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- killtracker/core/discord_messages.py,sha256=mOKiMWq-3WnaSUFbfgVmlkAedGTZ7OWcVxLp7n58-Z0,14132
14
- killtracker/core/killmails.py,sha256=v7ciMSPHyIg4L4d-Q8UECuqJShfxfd3g_sdfRnKKSPY,20499
14
+ killtracker/core/discord_messages.py,sha256=zepZ90-xtfvPafG0dIZYUWprozOi5I4Kjoj0jEQG5_U,16602
15
+ killtracker/core/killmails.py,sha256=6n2nuhiPbIQXJUf63E_3coGOQmJajx2QeDofO5FioRs,21842
16
+ killtracker/core/worker_shutdown.py,sha256=HHLR5DjLV67Sb3TDssoUnoOWO6_gcUkoov2aKV5qRNE,1289
15
17
  killtracker/management/commands/killtracker_load_eve.py,sha256=5P2wr6LU-EMl9_gG-DKP2yw3eFXOU7ApeuGAWEbvCKk,1159
16
18
  killtracker/migrations/0001_initial_new.py,sha256=WszI5DmNFtk45IZ2Zul3_Ak-VXmye9ffJKFAsGIxoXA,27818
17
19
  killtracker/migrations/0001_squashed_all.py,sha256=KXwOcRayjGGGmleg7-aTcXeIi-92Mn4BaGkEY3iE9Vc,26221
@@ -29,8 +31,8 @@ killtracker/migrations/0009_remove_old_models.py,sha256=bDIz0hywpFKbHYhdXFXzra5D
29
31
  killtracker/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
32
  killtracker/models/__init__.py,sha256=WL6VD9MK7EsZot_RLPz0nX8WxJkp7RtQpw_mYpnVqu8,188
31
33
  killtracker/models/killmails.py,sha256=CCdrHkwUSoTOGqavG-TpMxDRleF9UEacOTui8v3-VT8,5181
32
- killtracker/models/trackers.py,sha256=t3pm29UW_0JqBgHbU0Xx1qgLyft7_EjNtKCJ37OM_fE,31188
33
- killtracker/models/webhooks.py,sha256=hh1mYE4pBU26YFawkv1z-j4uyX8aT25B0crOTsocSSY,8268
34
+ killtracker/models/trackers.py,sha256=ATbwaQRYO6WgVt5rY3WZicB7D-08EmdDKdJ3WN949dY,31121
35
+ killtracker/models/webhooks.py,sha256=J4e5VupEpvcC-hWDg8BZ4ZrCSkqGFinGUDx95FKe52U,7593
34
36
  killtracker/static/killtracker/killtracker_logo.png,sha256=3jc9zmYHqP60Np5piP5RfkX0_II-315DNjZ4FRGbqKc,74625
35
37
  killtracker/static/killtracker/zkb_icon.png,sha256=wuVfgyTbTs9qS4KGbDAH3Q9KVPgHqYV5eaVrjEmTjsE,328
36
38
  killtracker/templates/admin/killtracker/tracker/killmail_test.html,sha256=TI2ON8qf9pW4rX6G7pT990ZadkipwncQgGUC0FPcWQY,649
@@ -38,17 +40,19 @@ killtracker/tests/__init__.py,sha256=CEt5qqp6ptDrx1lwuA6epZ5bzh1CwUJYXeMZqWK9jT0
38
40
  killtracker/tests/test_admin.py,sha256=XFAlF_Q4h5Z_agkmRtB30GmCayqQPblLolFrN41xu7Q,5659
39
41
  killtracker/tests/test_admin_2.py,sha256=rP0EscM9qUil_ZuXute3R8TQY2P5XSjmxHLbziCGcVw,1140
40
42
  killtracker/tests/test_exceptions.py,sha256=wheTwm0JOBqYVI-DJM4KK2usFAZT1Q-O52VMOnSAz8Y,326
41
- killtracker/tests/test_integration.py,sha256=EX0IQGU_Vwsmjeoqeprg13VuW8AT9I8CT1bm3_cvfPs,3226
42
- killtracker/tests/test_tasks.py,sha256=ZDoCUBd-1kSOKrvSeTrlDaSGFmzHieT5ef0iBz6nr2I,13929
43
+ killtracker/tests/test_integration.py,sha256=d1W7102L1_fOUmQJpvPE_5ldJf9iZRrj3LfMsTvtGBo,3245
44
+ killtracker/tests/test_tasks.py,sha256=eaxmImSJvYZneQqv5pYb5due0oS90JvLR0DHtGvyEh4,15990
45
+ killtracker/tests/utils.py,sha256=lpWD3peOyxiwq7z8kO4GLQl98kZ4mEcWgyuUTCUSp_Y,442
43
46
  killtracker/tests/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- killtracker/tests/core/test_discord_messages_1.py,sha256=1cYpj4E9pNqQOeE7yWeV1mme-JYGIHfSIibOauEHi88,3101
45
- killtracker/tests/core/test_discord_messages_2.py,sha256=AppA_FUFQA5I35UKjaEwn_ZQcnscqillR1SIo1unwJg,4774
46
- killtracker/tests/core/test_killmails.py,sha256=OFV6EbERi0UyMzXblLsNoJrPbLSIgtA27Wt9vGwOYd8,14349
47
+ killtracker/tests/core/test_discord_messages_1.py,sha256=P-s-zmStMi6fd0yrtKQJxiCVnD1GFF4JJ6ffrIXzYOw,4624
48
+ killtracker/tests/core/test_discord_messages_2.py,sha256=r-NwE_bpJSnedw3nIyad9XWgLa5ly6UPgYB-A7Mba30,4782
49
+ killtracker/tests/core/test_killmails.py,sha256=S08P50xMgq_hiKLeuryAcOI0hN3CnI-jzHKQaN9G5UU,16114
50
+ killtracker/tests/core/test_worker_shutdown.py,sha256=wg0fJQKVPibpRbBfoPCQZycl4rRSGRr6hrYxcRhtEnc,1014
47
51
  killtracker/tests/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
52
  killtracker/tests/models/test_killmails.py,sha256=0ytwIGbTPb1OTzmK8B9VnR1ylxMuaYtp2tvCXzNOwNc,8293
49
- killtracker/tests/models/test_trackers_1.py,sha256=_ARZKBrQz0QF6_OZEOFOsTqNdfflz7wWenAT-T35nqU,42771
50
- killtracker/tests/models/test_trackers_2.py,sha256=FmtaWBjV32NlIjYPaG5Kh87oES5ChoDMVJ4ol2uWopE,5404
51
- killtracker/tests/models/test_webhook.py,sha256=E4BgmQw9mI5ZenV6ncYHbBonlEeWvvdilAS8IKFkbjw,5246
53
+ killtracker/tests/models/test_trackers_1.py,sha256=7DqrF7LE0jJn1ATOQRU8BPcqsvgUIx2ccabOUYsCN-o,42794
54
+ killtracker/tests/models/test_trackers_2.py,sha256=kPCZuS9N3GUtoauMR96aZv9VI5ShAIQpJZLyo0SPOQM,5473
55
+ killtracker/tests/models/test_webhook.py,sha256=VeBm5qdBUHcauFfH2-OoaD8uplqv4D3l2TtVrS5iQzc,6116
52
56
  killtracker/tests/testdata/__init__.py,sha256=9aQhf8V-DseZMWjJ_QMXOba6CypoHFSVpYRZEUh-oFc,212
53
57
  killtracker/tests/testdata/create_eveuniverse.py,sha256=Ewr5OBiQwjK1kwDCRh3A3f0Z-CCPi8Gp8dpsPgVAU4A,966
54
58
  killtracker/tests/testdata/evealliances.json,sha256=i6udrtUnWQjn71Iw17WWz9Eb1fdGUNhI1UYLt0hZHog,307
@@ -61,7 +65,7 @@ killtracker/tests/testdata/killmails.json,sha256=HKfpXQJ_ikymBSewh4wWixYpLwC3kNB
61
65
  killtracker/tests/testdata/load_eveuniverse.py,sha256=FitVc12E_ob56ezK5Y1q07Kbyc7N8poHiCNaLRGU4Jg,388
62
66
  killtracker/tools/drop_tables_killtracker.sql,sha256=fJrGY23NKRunpYC3hI-klFkWub4sBuhfP8TaT__zjPg,1726
63
67
  killtracker/tools/generate_conditions_text.py,sha256=LxAtTQIX-IbuqaNDMV1XHhq5AbrrlwxLWgXa1M7DWQo,767
64
- aa_killtracker-0.17.0.dist-info/licenses/LICENSE,sha256=XZiwB_S_40_HhnvLg5xvtBb3g1oGjPrk0rpFwk8iInE,1070
65
- aa_killtracker-0.17.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
66
- aa_killtracker-0.17.0.dist-info/METADATA,sha256=ixjtGgUPTMWb4glIZb_EmI-WZMdl9R9BLLR-aUlV9Gg,13927
67
- aa_killtracker-0.17.0.dist-info/RECORD,,
68
+ aa_killtracker-0.18.0a2.dist-info/licenses/LICENSE,sha256=XZiwB_S_40_HhnvLg5xvtBb3g1oGjPrk0rpFwk8iInE,1070
69
+ aa_killtracker-0.18.0a2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
70
+ aa_killtracker-0.18.0a2.dist-info/METADATA,sha256=7xoqmIUN3AAKkHhGvuL04Fd3wP9QLCZEkPm4o2oH4l0,13929
71
+ aa_killtracker-0.18.0a2.dist-info/RECORD,,
killtracker/__init__.py CHANGED
@@ -3,7 +3,7 @@
3
3
  # pylint: disable = invalid-name
4
4
  default_app_config = "killtracker.apps.KillmailsConfig"
5
5
 
6
- __version__ = "0.17.0"
6
+ __version__ = "0.18.0a2"
7
7
  __title__ = "Killtracker"
8
8
 
9
9
  APP_NAME = "aa-killtracker"
killtracker/admin.py CHANGED
@@ -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 . import tasks
14
- from .core.killmails import Killmail
15
- from .forms import TrackerAdminForm, TrackerAdminKillmailIdForm, field_nice_display
16
- from .models import EveKillmail, EveKillmailAttacker, Tracker, Webhook
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.main_queue.size()
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.main_queue.clear()
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", 60
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", 100
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", 5)
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
killtracker/apps.py CHANGED
@@ -9,7 +9,5 @@ class KillmailsConfig(AppConfig):
9
9
  verbose_name = f"Killtracker v{__version__}"
10
10
 
11
11
  def ready(self) -> None:
12
- from . import checks # noqa: F401 pylint: disable=unused-import
13
- from .core.killmails import Killmail
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
- """Create discord messages from killmails."""
1
+ """This module allows to create Discord messages from killmails."""
2
2
 
3
- from typing import NamedTuple, Optional
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
- ICON_SIZE = 128
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
- class MainOrgInfo(NamedTuple):
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
- text: str = ""
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
- class FinalAttackerInfo(NamedTuple):
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
- class VictimInfo(NamedTuple):
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 create_content(tracker: Tracker, intro_text: Optional[str] = None) -> str:
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 create_embed(tracker: Tracker, killmail: Killmail) -> dhooks_lite.Embed:
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 = MainOrgInfo()
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
- return _create_embed(killmail, tracker, victim, description, title, thumbnail_url)
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
- def _calc_author(victim: VictimInfo):
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: MainOrgInfo,
260
+ main_org: _MainOrgInfo,
162
261
  main_ship_group_text: str,
163
262
  tracked_ship_types_text: str,
164
- victim: VictimInfo,
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
- ) -> VictimInfo:
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=ICON_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=ICON_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=ICON_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 VictimInfo(
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
- ) -> FinalAttackerInfo:
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 FinalAttackerInfo()
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 FinalAttackerInfo(name=final_attacker_str, ship_type=ship_type)
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=ICON_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=ICON_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 MainOrgInfo(
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: VictimInfo, main_org: MainOrgInfo):
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: MainOrgInfo,
394
- victim: VictimInfo,
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: