5 Commits

Author SHA1 Message Date
github-actions[bot] eaf611b203 chore: rebuild website roadmap [skip ci] 2026-07-09 16:48:10 +00:00
Rsclub2_2 e339b6fccf implement #49 2026-07-09 18:47:29 +02:00
github-actions[bot] bd9b42d4a5 chore: rebuild website roadmap [skip ci] 2026-07-09 16:46:38 +00:00
github-actions[bot] 275ce48769 chore: rebuild website [skip ci] 2026-07-09 14:12:59 +00:00
Rsclub2_2 d201997587 added automatic Changelog XML to new Website.
also now the XML gets pulled from new Website
2026-07-09 16:12:29 +02:00
52 changed files with 1340 additions and 79 deletions
@@ -22,7 +22,7 @@ public class ApplicationConstants {
*/
public static final double APPLICATION_CURRENTVERSIONNUMBER = 1.42;
public static final String VERSIONINFOURLFORUPDATES_KST4CONTEST = "https://do5amf.funkerportal.de/kst4ContestVersionInfo.xml";
public static final String VERSIONINFOURLFORUPDATES_KST4CONTEST = "https://kst4contest.hamradioonline.de/kst4ContestVersionInfo.xml";
public static final String VERSIONINFDOWNLOADEDLOCALFILE = "kst4ContestVersionInfo.xml";
public static final String STYLECSSFILE_DEFAULT_DAYLIGHT = "KST4ContestDefaultDay.css";
@@ -5970,9 +5970,19 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
txt_myQTF.getStyleClass().add("text-input");
txt_myQTF.getStyleClass().add("text-input-MYQRG1");
txt_myQTF.textProperty().bind(Bindings.createStringBinding(
() -> Double.toString(chatcontroller.getChatPreferences().getActualQTF().get()),
chatcontroller.getChatPreferences().getActualQTF()));
// Rotator sync on/off determines whether this field is bound (read-only, driven
// by PSTRotator) or free for manual entry, mirroring the MYQRG sync behaviour above.
if (chatcontroller.getChatPreferences().isStn_pstRotatorEnabled()) {
txt_myQTF.textProperty().bind(Bindings.createStringBinding(
() -> Double.toString(chatcontroller.getChatPreferences().getActualQTF().get()),
chatcontroller.getChatPreferences().getActualQTF()));
txt_myQTF.setTooltip(new Tooltip("This is your current QTF, read out at PSTRotator"));
txt_myQTF.setFocusTraversable(false);
} else {
txt_myQTF.setText(Double.toString(chatcontroller.getChatPreferences().getActualQTF().get()));
txt_myQTF.setTooltip(new Tooltip("Enter your antenna heading (QTF) by hand - no rotator sync active"));
txt_myQTF.setFocusTraversable(true);
}
txt_myQTF.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
@@ -5982,13 +5992,16 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
// System.out.println("Textfield on focus");
// Do nothing until field loses focus, user will enter his frequency
} else {
if (txt_myQTF.textProperty().isBound()) {
return; // rotator sync active, field is driven by PSTRotator
}
try {
System.out.println(
"[Main.java, Info]: Set the MYQTF property by hand to: " + txt_myQTF.getText());
chatcontroller.getChatPreferences().getActualQTF().set(Integer.parseInt(txt_myQTF.getText()));}
chatcontroller.getChatPreferences().getActualQTF().set(Double.parseDouble(txt_myQTF.getText()));}
catch (Exception exception) {
System.out.println("bullshit entered in myqtf");
txt_myQTF.setText("0");
txt_myQTF.setText("0.0");
}
}
}
@@ -5997,8 +6010,6 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
txt_myQTF.setPrefSize(40, 0);
// txt_ownqrg.setMinSize(40, 0);
txt_myQTF.setAlignment(Pos.BASELINE_RIGHT);
txt_myQTF.setTooltip(new Tooltip("This is your current QTF, read out at PSTRotator"));
txt_myQTF.setFocusTraversable(false);
SplitPane mainWindowLeftSplitPane = new SplitPane();
mainWindowLeftSplitPane.setOrientation(Orientation.HORIZONTAL);
@@ -8637,9 +8648,21 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
chkBx_station_pstRotatorEnabled.setTooltip(new Tooltip(
"If disabled: no PSTRotator connection is started and antenna direction is ignored in priority scoring."
));
chkBx_station_pstRotatorEnabled.selectedProperty().addListener((obs, oldV, newV) ->
chatcontroller.getChatPreferences().setStn_pstRotatorEnabled(newV)
);
chkBx_station_pstRotatorEnabled.selectedProperty().addListener((obs, oldV, newV) -> {
chatcontroller.getChatPreferences().setStn_pstRotatorEnabled(newV);
if (newV) {
txt_myQTF.textProperty().bind(Bindings.createStringBinding(
() -> Double.toString(chatcontroller.getChatPreferences().getActualQTF().get()),
chatcontroller.getChatPreferences().getActualQTF()));
txt_myQTF.setTooltip(new Tooltip("This is your current QTF, read out at PSTRotator"));
txt_myQTF.setFocusTraversable(false);
} else {
txt_myQTF.textProperty().unbind();
txt_myQTF.setText(Double.toString(chatcontroller.getChatPreferences().getActualQTF().get()));
txt_myQTF.setTooltip(new Tooltip("Enter your antenna heading (QTF) by hand - no rotator sync active"));
txt_myQTF.setFocusTraversable(true);
}
});
grdPnlStation.add(lblCallSign, 0, 0);
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="About KST4Contest">
<meta name="twitter:description" content="About KST4Contest and its contest-oriented ON4KST workflow.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Contact | KST4Contest">
<meta name="twitter:description" content="Contact options for KST4Contest.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Download KST4Contest">
<meta name="twitter:description" content="Download KST4Contest releases for Windows, Linux and macOS.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest FAQ">
<meta name="twitter:description" content="Frequently asked questions about KST4Contest, ON4KST contest operation, AirScout integration and VHF/UHF/SHF contest workflow.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="AirScout Integration">
<meta name="twitter:description" content="AirScout information helps operators evaluate AP windows, aircraft scatter timing and candidate stations during VHF/UHF/SHF contests.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Dual Chat Categories">
<meta name="twitter:description" content="Dual category support gives contest operators better overview when working across multiple ON4KST chat rooms.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="DXCluster Server">
<meta name="twitter:description" content="KST4Contest includes DXCluster functionality to support situational awareness during contest operation.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Features">
<meta name="twitter:description" content="Contest-optimized ON4KST features for VHF, UHF and SHF operation.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Log Synchronization">
<meta name="twitter:description" content="Log synchronization helps KST4Contest understand worked stations, active bands and contest context.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Macros and Variables">
<meta name="twitter:description" content="Macros reduce repetitive typing and help operators respond quickly during active ON4KST contest sessions.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Priority Score System">
<meta name="twitter:description" content="KST4Contest ranks stations by activity, direction, sked context, band information, QRG hints and operator workflow signals.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Sked Reminder">
<meta name="twitter:description" content="KST4Contest keeps skeds in focus while the operator handles chat traffic, logging, bands and aircraft scatter timing.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Timeline View">
<meta name="twitter:description" content="The timeline view helps operators understand short propagation windows and candidate timing during active contest operation.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Contest-Optimized ON4KST Chat Client">
<meta name="twitter:description" content="KST4Contest is a modern ON4KST chat client built for VHF, UHF and SHF contest operation.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+537
View File
@@ -0,0 +1,537 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<praktiKST>
<latestVersion>
<versionNumber>1.411</versionNumber>
<adminMessage></adminMessage>
<majorChanges>- Score of Top-Priority Candidates in the user section
- Broadcast Messages (To ALL Station in Contest) in seperate Window</majorChanges>
<latestVersionPathOnWebserver>https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/praktiKST-v1.41.1-windows-x64.zip</latestVersionPathOnWebserver>
</latestVersion>
<needUpdateSinceLastVersion>
<filename>nothing</filename>
</needUpdateSinceLastVersion>
<roadmap>
<featurerequest>
<featureDescription>Cyclic update of own name in chat to actual QRG</featureDescription>
<requestDate>2024-02</requestDate>
<state>open</state>
</featurerequest>
<featurerequest>
<featureDescription>Acoustic warnings</featureDescription>
<requestDate>2023-12</requestDate>
<state>added</state>
</featurerequest>
<featurerequest>
<featureDescription>Airscout support</featureDescription>
<requestDate>2023-03</requestDate>
<state>added</state>
</featurerequest>
<featurerequest>
<featureDescription>cyclic beacon messages in public chat</featureDescription>
<requestDate>2023-03</requestDate>
<state>added</state>
</featurerequest>
</roadmap>
<bugsReported>
<bug>
<bugdescription>
stations like ol7c-7 and ol7c-2 will not be marked as worked if only "ol7c"
is in the log. Need to interprete that. May ignore suffix starting with "-"</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>
worked callsigns table is updated only once after connected to chat
Should be available directly after program started.
But Reset works all time</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request: language-specific strings, maybe based to an xml file
</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request: Macros
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Automatic elimination of calls already connected from the log
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Limitation of users beyond a certain QRB
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
User division for QTF perhaps settable based on the antenna lobe
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Notification of new incoming users</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Evidence of a call which was written but not responded to.
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
direction based reachable-warnings:
if the chatclient detects a realised qso between two stations which both must have
directed their beams to my station, there should be an instant warning to me for
working at least one of the stations at the detected qrg</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request:
implement ASShowpath message to airacout;
by doubleclicking a callsign in the chatmember list, the path and plane state should be
provided by airscout </bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request:
make chatlines copyable to the clipboard...</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request:
adding an activity detection for sensing if another chatmembers alive-state</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>On sql error close the connection to make a clean exit</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>SETNAME /MYQRG in options menu doesnt work</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>Disconnect button does not work (DL5ZK)</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>Password-wrong error not displayed (DO5SA)</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>/CQ isnt written on own PMs</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>rightclick-textsnippets arent available in cq-table</bugdescription>
<state>solved</state>
</bug>
</bugsReported>
<changeLog>
<changedVersionNumber>1.411</changedVersionNumber>
<date>2026-07-08</date>
<description>Release v1.41.1</description>
<added></added>
<changed>Hotfix of Bug #56</changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.41</changedVersionNumber>
<date>2026-07-01</date>
<description>Release v1.41.0</description>
<added>- Score of Top-Priority Candidates in the user section
- Broadcast Messages (To ALL Station in Contest) in seperate Window</added>
<changed>Migration to Github
- Band and Frequency Detection per Chatmember — KST4Contest identifies which bands or frequencies a station appears active or reachable on based on chat data. This information is integrated into the display and prioritization.
- Band Alert — If a logged station could be of interest on other locally active bands, KST14Contest can alert the user.
- Sked Reminder ALERT — New reminder function for planned Skeds to ensure that agreed contacts are not forgotten during contest operation.
- Skedfail Button — Failed Skeds can be marked; this allows the station to be handled differently in terms of score and workflow.
- Win-Test SKED Push via UDP — Skeds can be passed to Win-Test via a LOCKSKED/ADDSKED/UNLOCKSKED sequence. This feature is configurable in the preferences and disabled by default.
- Win-Test Broadcast Defaults and SKed Workflow — Improved broadcast addresses, frequency formats, mode selection, and notes including locator/azimuth.
- PSTRotator Interface — KST4Contest received an interface to PSTRoter to better integrate antenna direction and rotator workflow.
- QSO /-Callsign Sniffer — Callsigns or QSO-relevant information can be detected and utilized for further workflow.
- Chat History at Startup — Historical chat data can be loaded upon startup, allowing the client to quickly gain relevant context for scoring, activity, and station identification.
- Station Map / Map View — New map view with station markers, your own location, locator/Maidenhead reference, connection line, and antenna/beam representation.
- Local Leaflet /-TileProxy Backend — The map function utilizes embedded Leaflet resources and a local TileProxy approach, making the map more portable and independent.
- Maidenhead /-Grid Overlay — The map can display locator/grid information; recently added Grid-Square coloring.
- Path /-Terrain /-Horizon Profile — Map documentation describes a path profile with terrain, Fresnel, and horizon information for the selected link.
- Tropo /-AS Reachability Filters — New filters and sorting were added for Tropospheric reachability, AirScoop availability, large locator fields, and priority.
- Reachability Band Selector — Added a band selection for range/Troposphere calculations.
- 4-Char Locator Filter — Locator evaluations can be reduced to 4-character fields; this improves overview and performance.
- KST Testserver Support — A KST server test server was added into the Source.
@praktimarc and @Rsclub22</changed>
<fixed>- [BUG]
- [BUG] Programmstart kann ohne selektieren keine Nachrichten senden
- KST4Contest crashes after to many messages or to much RAM Usage
- Scaling Problem at 1280x800 screen resolution</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.40</changedVersionNumber>
<date>2026-02-16</date>
<description>Much changes and fixes</description>
<added>
- win-test support (not deactivable yet, beta)
- QSO sniffer which filters changable callsigns lists messages to your pm window
- Chatmember Score system. Each chatmember gets a score depending to antenna direction, activity time,
activity msgcount, positive signals, active bands, active frequencies, his sked direction (degrees),
self handed rate, sked-made-rate and some others
- Chatmember Band and frequency recognition: now we list all active bands of each other chatmember
- Band alert for logged stations
- Sked reminder ALERT with automatic messages in 2+1 / 5+2+1 / 10+5+2+1 minutes
- PSTRotator interface
- AirPlane Timeline
- Skedfail button in furtherinfo panel
- Wintest logsynch interface can now be activated and deactivated in the preferences
- load chat history on startup
</added>
<changed>
- added save option: ServerDNS / Port
- added save option: activate/deactivate pstRotator interface
- added save option: activate/deactivate wintest interface
- added save option: callsign sniffer
- added save option: boolean GUI_darkModeActiveByDefault = false
- added AP notes at the internal DX cluster spots
- Generic Autoanswer fires maximum once in 45 seconds per rx callsign
</changed>
<fixed>
- Userlist sort automatically on new member signon
- Posonpill-messages now kills only exactly one Client instance (bugreport 9A2HM)
- Crash of wtkst by disconnection of kst4Contest
- wtKST crashes when kst4contest is running (many reporters)
- wintest: logged per band excludes pre worked band (bugreport SM6VTZ)
- PSTRotator SOCKET Close on DISCONNECT BUTTON works now
- AirScout Map had not been updated (bugreport SM0RJV)
- QTFDefault had been not saved correctly (bugreport SM0RJV)
- Show path in AS button worked only with fixed server Strings (bugreport 9A2HM)
- Version number had been displayed wrong
- suffixes like /p, -2, etc. problem now fixed everywhere
- Dark mode: passing for qrg fields fix
</fixed>
<removed>
- No more date display. Not needed. Saving space, only time is important
</removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.31</changedVersionNumber>
<date>2025-12-13</date>
<description>Much changes and a hotfix</description>
<added>
- win-test support (not deactivable yet, beta)
- pstRotator support (not deactivable yet, beta)
- airScout fix (calculations depends to cpu load now)
- QSO sniffer
</added>
<changed>
- DNS from www.on4kst.info to www.on4kst.org (hotfix, now configurable in preferences)
</changed>
<fixed>
- Endless loop in error case lets freeze the client
- PSTRotator SOCKET Close on DISCONNECT BUTTON
- Dark mode: passing for qrg fields fix
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.266</changedVersionNumber>
<date>2025-10-03</date>
<description>Airscout interface did not work with multi-signons</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>
Fixed by using raw callsign (without -2 suffix etc.) when communicating with AirScout.
Thank you very much for testing this, Kreso 9A2HM!
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.265</changedVersionNumber>
<date>2025-09-28</date>
<description>Direction buttons stay now colored, if activated</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>The buttons stay now colored, if activated</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.264</changedVersionNumber>
<date>2025-08-02</date>
<description>Changed the callsign recognition pattern for Simplelogfile</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>
Callsigns like S53CC, S51A etc. are now correctly marked as worked in SimpleLogFile.txt.
(bugreport Boris, S53CC)
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.263</changedVersionNumber>
<date>2025-06-08</date>
<description>Airscout communication and Loginname</description>
<added>nothing</added>
<changed>
Only entries with QRB lower than max-QRB are sent to AirScout in 60s intervals (was 12s for all).
</changed>
<fixed>
- AS communication message count hugely reduced
- Name in chat is now saveable
- Fixed AS client name (was hard-wired to "KST")
73 / DO5AMF
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.262</changedVersionNumber>
<date>2025-05-21</date>
<description>Freezes caused by getting messages before user login should be fixed now</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>
ON4KST delivers messages of stations not yet logged in. That caused a freeze at the message
processing engine which is now fixed.
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.26</changedVersionNumber>
<date>2025-05</date>
<description>Login to multiple Channels via single signon / spend some colors</description>
<added>
1. UI: Dark mode. Switch in "Window -> use dark mode"
2. Usage of two Chatcategories at the same time
3. opposite station multi-callsign login-tagging
73 / DO5AMF
</added>
<changed>
- Coloring mechanic of the software. Modify colors via css by yourself...
</changed>
<fixed>
- Station tagging fixed completely
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.251</changedVersionNumber>
<date>2025-02</date>
<description>BUGFIX of 1.25, tnx Steve Clements!</description>
<added>
- Steve spotted a problem in udp broadcast spot info reading, its now fixed!
73 / DO5AMF
</added>
<changed></changed>
<fixed>- Station tagging</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.25</changedVersionNumber>
<date>2025-02</date>
<description>Wishlist-time</description>
<added>
- New configuration Tab: Messagehandling (auto-answering, CQ qrg auto-answer)
- Coloured lines: new pm rows appear in red, fade rainbow-like to white over 30s (tnx Gianluca)
73 / DO5AMF
</added>
<changed></changed>
<fixed>
- Users with suffixes like "-2 and -70" are now correctly marked as worked
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.24</changedVersionNumber>
<date>2024-11</date>
<description>Wishlist-time</description>
<added>
- Button to show qrz.com profile of a selected station
- Button to show qrzcq.com profile of a selected station
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.23</changedVersionNumber>
<date>2024-10</date>
<description>DXCluster Server is now implemented</description>
<added>
- DXCluster Server (tnx OMAAO): KST4Contest now provides a DXCluster server to feed
your log client with station-reachable warnings.
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.22</changedVersionNumber>
<date>2024-05</date>
<description>Increase usability, fixed AS button</description>
<added>- Variables (tnx OMAAO): MYLOCATORSHORT, MYQRGSHORT, QRZNAME</added>
<changed>- Sendtext-field focus on callsign click</changed>
<fixed>
- Worked-station-filter (tnx Gianluca): filter is now live
- Chatters list sorting by QRB (tnx Alessandro): fixed to numeric sort
- Airscout showpath button now maximizes AS and shows the path
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.21</changedVersionNumber>
<date>2024-04</date>
<description>Increase usability</description>
<added></added>
<changed>
- Window sizes and divider positions are now stored and restored on next startup
- Filters section is now a flowpane for lower resolutions
</changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.2</changedVersionNumber>
<date>2024-04</date>
<description>Increase usability</description>
<added>
- Selectable bands
- Unworkable tags for each callsign per band
- QTF-Arrow on the "show path in AS" button
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.1</changedVersionNumber>
<date>2024-03</date>
<description>Increased workflow</description>
<added>
- Reachable warning function
- Variables FIRSTAP and SECONDAP for predefined texts
- Marking new connected stations (bold) and away-state (brackets)
- Activity-timer since last message of a chatter
</added>
<changed>- QRB/QTF info in pm-window</changed>
<fixed>
- Behaviour of messagefilter-radiobutton corrected (tnx Gian)
- Error sending macros on selected stations in pm window (tnx Gian)
</fixed>
<removed>- boot sound</removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.0</changedVersionNumber>
<date>2024-02</date>
<description>First stable release</description>
<added>
- audio notification support
- update-available warning
- changelog displaying
- known-bugs displaying
- message filters for selected station
- stationlist-filters (show by qtf / textstring, hide by qrb, qtf, workedstate)
- 10 macros (textsnippets available by hitting strg+numberkey)
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.9</changedVersionNumber>
<date>2024-02</date>
<description>Now the chat is disconnectable without closing it</description>
<added></added>
<changed></changed>
<fixed>disconnect-button, Textsnippets in CQ Window, "/CQ" at click on own sendtexts,
setname "qrg" works now</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.8</changedVersionNumber>
<date>2023-10</date>
<description>savesettings function and disconnect function added. MYCALL-Highlighting fixed</description>
<added>savesettings function, disconnect function</added>
<changed></changed>
<fixed>MYCALL-Highlighting</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.7</changedVersionNumber>
<date>2023-07</date>
<description>Internal database for worked stations, shortcut and textsnippet editor</description>
<added>database, shortcut-editor, textsnipped-editor</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.6</changedVersionNumber>
<date>2023-07</date>
<description>Added periodically sent beacon function</description>
<added>beacon to public channel</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.5</changedVersionNumber>
<date>2023-02</date>
<description>Airscout interface, UDP interfaces for worked-station data and TRX info, shortcuts</description>
<added>Airscout-interface, packetreceiver for ucxlog, n1mm, qartest</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.4</changedVersionNumber>
<date>2022-12</date>
<description>Worked info by logfile via universal pattern matching logfile interpreter</description>
<added>simple-logfile</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.3</changedVersionNumber>
<date>2022-10</date>
<description>Added a GUI, chat was text based only</description>
<added>Graphical user interface</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.2</changedVersionNumber>
<date>2022-10</date>
<description>Pattern matching system for frequency information, frequency collection per chatmember</description>
<added>frequency-extraction for every callsign</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.15</changedVersionNumber>
<date>2022-09</date>
<description>Researched the Chatprotocol and developed the base communication with the chatserver</description>
<added></added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.1</changedVersionNumber>
<date>2022-09</date>
<description>Primary architecture of the chat, message bus system for handling the message queues</description>
<added></added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
</praktiKST>
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Legal Notice | KST4Contest">
<meta name="twitter:description" content="Legal notice for the KST4Contest website.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Deutsches Handbuch">
<meta name="twitter:description" content="Deutsches Benutzerhandbuch für KST4Contest.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest English Manual">
<meta name="twitter:description" content="English user manual for KST4Contest.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Manual">
<meta name="twitter:description" content="Online manual for KST4Contest, the contest-optimized ON4KST chat client.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Hotfix Version 1.41.1">
<meta name="twitter:description" content="Contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Website Launch">
<meta name="twitter:description" content="Contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest News">
<meta name="twitter:description" content="News, release updates and development notes for KST4Contest.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="Privacy Policy | KST4Contest">
<meta name="twitter:description" content="Privacy policy for the KST4Contest website.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+3 -3
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Roadmap">
<meta name="twitter:description" content="Planned enhancements for upcoming KST4Contest versions, generated from GitHub milestones and issues.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
@@ -89,8 +89,8 @@
<a href="https://github.com/praktimarc/kst4contest/issues/52">[FEATURE] center horizontal slider</a>
</li>
<li>
<a href="https://github.com/praktimarc/kst4contest/issues/49">[FEATURE] QTF degree, manual change</a>
<li class="roadmap-done">
<a href="https://github.com/praktimarc/kst4contest/issues/49">[FEATURE] QTF degree, manual change</a>
</li>
<li class="roadmap-done">
+1 -1
View File
@@ -17,7 +17,7 @@
<meta name="twitter:title" content="KST4Contest Screenshots">
<meta name="twitter:description" content="Screenshots of KST4Contest, the contest-optimized ON4KST chat client for VHF, UHF and SHF operators.">
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
<link rel="stylesheet" href="/assets/css/main.css?v=1783615687631">
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
+22 -22
View File
@@ -10,90 +10,90 @@
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/about/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/contact/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/download/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/faq/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/airscout/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/dual-chat/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/dx-cluster/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/log-sync/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/macros/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/priority-score/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/sked-reminder/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/features/timeline/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/legal-notice/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/manual/de/airscout-integration/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/manual/de/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/manual/en/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/manual/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/privacy/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/roadmap/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
<url>
<loc>https://kst4contest.hamradioonline.de/screenshots/</loc>
<lastmod>2026-07-08</lastmod>
<lastmod>2026-07-09</lastmod>
</url>
</urlset>
+382
View File
@@ -0,0 +1,382 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Historical changelog entries for releases not published as GitHub Releases.
The CI pipeline prepends new entries from GitHub Releases on top of these. -->
<history>
<changeLog>
<changedVersionNumber>1.41</changedVersionNumber>
<date>2026-07-01</date>
<description>Map view and path calculations</description>
<added>
Band and Frequency Detection per Chatmember, Band alert, Win-Test SKED Push via UDP,
Win-Test Broadcast Defaults and SKed Workflow, Chat History at Startup, Station Map / Map View
Local Leaflet /-TileProxy Backend, Maidenhead /-Grid Overlay, Path calculation, path profile,
Reachability filters, NAC filters (grid sqaure marking)
</added>
<changed>
button housing, it works now on smaller screens / plus: detecting maximum screen size
</changed>
<fixed>
9A2HM reported that 23cm qsos with N1MM are not marked correctly, ist fixed
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.40</changedVersionNumber>
<date>2026-02-16</date>
<description>Much changes and fixes</description>
<added>
- win-test support (not deactivable yet, beta)
- QSO sniffer which filters changable callsigns lists messages to your pm window
- Chatmember Score system. Each chatmember gets a score depending to antenna direction, activity time,
activity msgcount, positive signals, active bands, active frequencies, his sked direction (degrees),
self handed rate, sked-made-rate and some others
- Chatmember Band and frequency recognition: now we list all active bands of each other chatmember
- Band alert for logged stations
- Sked reminder ALERT with automatic messages in 2+1 / 5+2+1 / 10+5+2+1 minutes
- PSTRotator interface
- AirPlane Timeline
- Skedfail button in furtherinfo panel
- Wintest logsynch interface can now be activated and deactivated in the preferences
- load chat history on startup
</added>
<changed>
- added save option: ServerDNS / Port
- added save option: activate/deactivate pstRotator interface
- added save option: activate/deactivate wintest interface
- added save option: callsign sniffer
- added save option: boolean GUI_darkModeActiveByDefault = false
- added AP notes at the internal DX cluster spots
- Generic Autoanswer fires maximum once in 45 seconds per rx callsign
</changed>
<fixed>
- Userlist sort automatically on new member signon
- Posonpill-messages now kills only exactly one Client instance (bugreport 9A2HM)
- Crash of wtkst by disconnection of kst4Contest
- wtKST crashes when kst4contest is running (many reporters)
- wintest: logged per band excludes pre worked band (bugreport SM6VTZ)
- PSTRotator SOCKET Close on DISCONNECT BUTTON works now
- AirScout Map had not been updated (bugreport SM0RJV)
- QTFDefault had been not saved correctly (bugreport SM0RJV)
- Show path in AS button worked only with fixed server Strings (bugreport 9A2HM)
- Version number had been displayed wrong
- suffixes like /p, -2, etc. problem now fixed everywhere
- Dark mode: passing for qrg fields fix
</fixed>
<removed>
- No more date display. Not needed. Saving space, only time is important
</removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.31</changedVersionNumber>
<date>2025-12-13</date>
<description>Much changes and a hotfix</description>
<added>
- win-test support (not deactivable yet, beta)
- pstRotator support (not deactivable yet, beta)
- airScout fix (calculations depends to cpu load now)
- QSO sniffer
</added>
<changed>
- DNS from www.on4kst.info to www.on4kst.org (hotfix, now configurable in preferences)
</changed>
<fixed>
- Endless loop in error case lets freeze the client
- PSTRotator SOCKET Close on DISCONNECT BUTTON
- Dark mode: passing for qrg fields fix
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.266</changedVersionNumber>
<date>2025-10-03</date>
<description>Airscout interface did not work with multi-signons</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>
Fixed by using raw callsign (without -2 suffix etc.) when communicating with AirScout.
Thank you very much for testing this, Kreso 9A2HM!
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.265</changedVersionNumber>
<date>2025-09-28</date>
<description>Direction buttons stay now colored, if activated</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>The buttons stay now colored, if activated</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.264</changedVersionNumber>
<date>2025-08-02</date>
<description>Changed the callsign recognition pattern for Simplelogfile</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>
Callsigns like S53CC, S51A etc. are now correctly marked as worked in SimpleLogFile.txt.
(bugreport Boris, S53CC)
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.263</changedVersionNumber>
<date>2025-06-08</date>
<description>Airscout communication and Loginname</description>
<added>nothing</added>
<changed>
Only entries with QRB lower than max-QRB are sent to AirScout in 60s intervals (was 12s for all).
</changed>
<fixed>
- AS communication message count hugely reduced
- Name in chat is now saveable
- Fixed AS client name (was hard-wired to "KST")
73 / DO5AMF
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.262</changedVersionNumber>
<date>2025-05-21</date>
<description>Freezes caused by getting messages before user login should be fixed now</description>
<added>nothing</added>
<changed>nothing</changed>
<fixed>
ON4KST delivers messages of stations not yet logged in. That caused a freeze at the message
processing engine which is now fixed.
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.26</changedVersionNumber>
<date>2025-05</date>
<description>Login to multiple Channels via single signon / spend some colors</description>
<added>
1. UI: Dark mode. Switch in "Window -> use dark mode"
2. Usage of two Chatcategories at the same time
3. opposite station multi-callsign login-tagging
73 / DO5AMF
</added>
<changed>
- Coloring mechanic of the software. Modify colors via css by yourself...
</changed>
<fixed>
- Station tagging fixed completely
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.251</changedVersionNumber>
<date>2025-02</date>
<description>BUGFIX of 1.25, tnx Steve Clements!</description>
<added>
- Steve spotted a problem in udp broadcast spot info reading, its now fixed!
73 / DO5AMF
</added>
<changed></changed>
<fixed>- Station tagging</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.25</changedVersionNumber>
<date>2025-02</date>
<description>Wishlist-time</description>
<added>
- New configuration Tab: Messagehandling (auto-answering, CQ qrg auto-answer)
- Coloured lines: new pm rows appear in red, fade rainbow-like to white over 30s (tnx Gianluca)
73 / DO5AMF
</added>
<changed></changed>
<fixed>
- Users with suffixes like "-2 and -70" are now correctly marked as worked
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.24</changedVersionNumber>
<date>2024-11</date>
<description>Wishlist-time</description>
<added>
- Button to show qrz.com profile of a selected station
- Button to show qrzcq.com profile of a selected station
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.23</changedVersionNumber>
<date>2024-10</date>
<description>DXCluster Server is now implemented</description>
<added>
- DXCluster Server (tnx OMAAO): KST4Contest now provides a DXCluster server to feed
your log client with station-reachable warnings.
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.22</changedVersionNumber>
<date>2024-05</date>
<description>Increase usability, fixed AS button</description>
<added>- Variables (tnx OMAAO): MYLOCATORSHORT, MYQRGSHORT, QRZNAME</added>
<changed>- Sendtext-field focus on callsign click</changed>
<fixed>
- Worked-station-filter (tnx Gianluca): filter is now live
- Chatters list sorting by QRB (tnx Alessandro): fixed to numeric sort
- Airscout showpath button now maximizes AS and shows the path
</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.21</changedVersionNumber>
<date>2024-04</date>
<description>Increase usability</description>
<added></added>
<changed>
- Window sizes and divider positions are now stored and restored on next startup
- Filters section is now a flowpane for lower resolutions
</changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.2</changedVersionNumber>
<date>2024-04</date>
<description>Increase usability</description>
<added>
- Selectable bands
- Unworkable tags for each callsign per band
- QTF-Arrow on the "show path in AS" button
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.1</changedVersionNumber>
<date>2024-03</date>
<description>Increased workflow</description>
<added>
- Reachable warning function
- Variables FIRSTAP and SECONDAP for predefined texts
- Marking new connected stations (bold) and away-state (brackets)
- Activity-timer since last message of a chatter
</added>
<changed>- QRB/QTF info in pm-window</changed>
<fixed>
- Behaviour of messagefilter-radiobutton corrected (tnx Gian)
- Error sending macros on selected stations in pm window (tnx Gian)
</fixed>
<removed>- boot sound</removed>
</changeLog>
<changeLog>
<changedVersionNumber>1.0</changedVersionNumber>
<date>2024-02</date>
<description>First stable release</description>
<added>
- audio notification support
- update-available warning
- changelog displaying
- known-bugs displaying
- message filters for selected station
- stationlist-filters (show by qtf / textstring, hide by qrb, qtf, workedstate)
- 10 macros (textsnippets available by hitting strg+numberkey)
</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.9</changedVersionNumber>
<date>2024-02</date>
<description>Now the chat is disconnectable without closing it</description>
<added></added>
<changed></changed>
<fixed>disconnect-button, Textsnippets in CQ Window, "/CQ" at click on own sendtexts,
setname "qrg" works now</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.8</changedVersionNumber>
<date>2023-10</date>
<description>savesettings function and disconnect function added. MYCALL-Highlighting fixed</description>
<added>savesettings function, disconnect function</added>
<changed></changed>
<fixed>MYCALL-Highlighting</fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.7</changedVersionNumber>
<date>2023-07</date>
<description>Internal database for worked stations, shortcut and textsnippet editor</description>
<added>database, shortcut-editor, textsnipped-editor</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.6</changedVersionNumber>
<date>2023-07</date>
<description>Added periodically sent beacon function</description>
<added>beacon to public channel</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.5</changedVersionNumber>
<date>2023-02</date>
<description>Airscout interface, UDP interfaces for worked-station data and TRX info, shortcuts</description>
<added>Airscout-interface, packetreceiver for ucxlog, n1mm, qartest</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.4</changedVersionNumber>
<date>2022-12</date>
<description>Worked info by logfile via universal pattern matching logfile interpreter</description>
<added>simple-logfile</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.3</changedVersionNumber>
<date>2022-10</date>
<description>Added a GUI, chat was text based only</description>
<added>Graphical user interface</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.2</changedVersionNumber>
<date>2022-10</date>
<description>Pattern matching system for frequency information, frequency collection per chatmember</description>
<added>frequency-extraction for every callsign</added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.15</changedVersionNumber>
<date>2022-09</date>
<description>Researched the Chatprotocol and developed the base communication with the chatserver</description>
<added></added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
<changeLog>
<changedVersionNumber>0.1</changedVersionNumber>
<date>2022-09</date>
<description>Primary architecture of the chat, message bus system for handling the message queues</description>
<added></added>
<changed></changed>
<fixed></fixed>
<removed></removed>
</changeLog>
</history>
@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Static roadmap/bugsReported sections carried over from the previously
hand-maintained kst4ContestVersionInfo.xml on do5amf.funkerportal.de.
UpdateChecker.java does not parse these today; kept for parity/history. -->
<legacy>
<roadmap>
<featurerequest>
<featureDescription>Cyclic update of own name in chat to actual QRG</featureDescription>
<requestDate>2024-02</requestDate>
<state>open</state>
</featurerequest>
<featurerequest>
<featureDescription>Acoustic warnings</featureDescription>
<requestDate>2023-12</requestDate>
<state>added</state>
</featurerequest>
<featurerequest>
<featureDescription>Airscout support</featureDescription>
<requestDate>2023-03</requestDate>
<state>added</state>
</featurerequest>
<featurerequest>
<featureDescription>cyclic beacon messages in public chat</featureDescription>
<requestDate>2023-03</requestDate>
<state>added</state>
</featurerequest>
</roadmap>
<bugsReported>
<bug>
<bugdescription>
stations like ol7c-7 and ol7c-2 will not be marked as worked if only "ol7c"
is in the log. Need to interprete that. May ignore suffix starting with "-"</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>
worked callsigns table is updated only once after connected to chat
Should be available directly after program started.
But Reset works all time</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request: language-specific strings, maybe based to an xml file
</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request: Macros
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Automatic elimination of calls already connected from the log
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Limitation of users beyond a certain QRB
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
User division for QTF perhaps settable based on the antenna lobe
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Notification of new incoming users</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
Evidence of a call which was written but not responded to.
</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>feature request:
direction based reachable-warnings:
if the chatclient detects a realised qso between two stations which both must have
directed their beams to my station, there should be an instant warning to me for
working at least one of the stations at the detected qrg</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request:
implement ASShowpath message to airacout;
by doubleclicking a callsign in the chatmember list, the path and plane state should be
provided by airscout </bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request:
make chatlines copyable to the clipboard...</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>feature request:
adding an activity detection for sensing if another chatmembers alive-state</bugdescription>
<state>added</state>
</bug>
<bug>
<bugdescription>On sql error close the connection to make a clean exit</bugdescription>
<state>open</state>
</bug>
<bug>
<bugdescription>SETNAME /MYQRG in options menu doesnt work</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>Disconnect button does not work (DL5ZK)</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>Password-wrong error not displayed (DO5SA)</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>/CQ isnt written on own PMs</bugdescription>
<state>solved</state>
</bug>
<bug>
<bugdescription>rightclick-textsnippets arent available in cq-table</bugdescription>
<state>solved</state>
</bug>
</bugsReported>
</legacy>
+183
View File
@@ -0,0 +1,183 @@
const fs = require("fs");
const path = require("path");
const REPO = "praktimarc/kst4contest";
const API = `https://api.github.com/repos/${REPO}`;
const LABEL_MAP = { enhancement: "added", bug: "fixed" };
async function githubGet(urlPath) {
const headers = { Accept: "application/vnd.github+json" };
if (process.env.GITHUB_TOKEN) {
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
}
const res = await fetch(`${API}${urlPath}`, { headers });
if (!res.ok) {
throw new Error(`GitHub API ${urlPath} failed: ${res.status}`);
}
return res.json();
}
// UpdateChecker.java parses <versionNumber> with Double.parseDouble() and
// compares it against ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER,
// which encodes patch releases by appending the patch digit(s) instead of a
// third dot (e.g. tag v1.41.1 -> app version 1.411, v1.41.0 -> 1.41). See
// commit 38ef50c ("...set to 1.41.1 for upcoming hotfix" -> 1.411).
function toAppVersionNumber(tag) {
const cleaned = tag.replace(/^v/, "");
const [major, minor, ...rest] = cleaned.split(".");
if (rest.length === 0) return cleaned;
const patch = rest.join("");
return /^0*$/.test(patch) ? `${major}.${minor}` : `${major}.${minor}${patch}`;
}
function escapeXml(value) {
return String(value ?? "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;");
}
// Strips GitHub's auto-generated release-notes markdown noise (headings,
// "Full Changelog" links, PR author attributions) down to plain text.
function cleanReleaseBody(body) {
const lines = [];
for (let line of (body || "").split("\n")) {
if (/^#{1,3}\s/.test(line)) continue;
if (line.trim().startsWith("**Full Changelog**")) continue;
line = line.replace(/\s+by @\S+ in https:\/\/\S+/, "");
line = line.replace(/^\* /, "- ");
if (line.trim()) lines.push(line);
}
return lines.join("\n").replace(/\n{3,}/g, "\n\n").trim();
}
// Groups closed issues (excluding PRs) in the (since, until] window by
// label into "added" (enhancement) / "fixed" (bug) bullet lists.
async function getIssuesForRelease(since, until) {
const buckets = { added: [], fixed: [] };
let page = 1;
for (;;) {
const items = await githubGet(`/issues?state=closed&per_page=100&page=${page}`);
if (!items.length) break;
for (const issue of items) {
if (issue.pull_request) continue;
const closed = issue.closed_at || "";
if (!(closed > since && closed <= until)) continue;
const labels = issue.labels.map((l) => l.name);
const bucket = Object.keys(LABEL_MAP).find((l) => labels.includes(l));
if (bucket) buckets[LABEL_MAP[bucket]].push(`- ${issue.title}`);
}
if (items.length < 100) break;
page++;
}
return { added: buckets.added.join("\n"), fixed: buckets.fixed.join("\n") };
}
// version-history.xml holds hand-written <changeLog> entries for releases
// published before GitHub Releases existed; re-emitted verbatim here.
function loadHistoryEntries() {
const historyPath = path.join(__dirname, "version-history.xml");
const xml = fs.readFileSync(historyPath, "utf-8");
return [...xml.matchAll(/<changeLog>[\s\S]*?<\/changeLog>/g)].map((m) => m[0]);
}
function historyEntryVersion(entryXml) {
const m = entryXml.match(/<changedVersionNumber>([\s\S]*?)<\/changedVersionNumber>/);
return m ? m[1].trim() : null;
}
// Static <roadmap>/<bugsReported> sections carried over from the previous
// hand-maintained XML on do5amf.funkerportal.de. UpdateChecker.java doesn't
// parse these, kept only so the migration doesn't drop existing content.
function loadLegacySections() {
const legacyPath = path.join(__dirname, "version-legacy-sections.xml");
const xml = fs.readFileSync(legacyPath, "utf-8");
const roadmap = xml.match(/<roadmap>[\s\S]*?<\/roadmap>/);
const bugsReported = xml.match(/<bugsReported>[\s\S]*?<\/bugsReported>/);
return [roadmap ? roadmap[0] : null, bugsReported ? bugsReported[0] : null].filter(Boolean);
}
// Builds kst4ContestVersionInfo.xml (the update-checker feed read by
// UpdateChecker.java) from GitHub releases + closed issues, falling back to
// version-history.xml for releases that predate GitHub Releases.
module.exports = async function () {
const fallback = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<praktiKST></praktiKST>';
try {
const historyEntries = loadHistoryEntries();
const rawReleases = await githubGet("/releases?per_page=100");
const releases = rawReleases
.map((r) => ({
tagName: r.tag_name,
publishedAt: r.published_at || "",
name: r.name || r.tag_name,
body: r.body || "",
isPrerelease: r.prerelease
}))
.sort((a, b) => (a.publishedAt < b.publishedAt ? 1 : -1));
const stableReleases = releases.filter((r) => !r.isPrerelease);
const stable = stableReleases[0];
const ghVersions = new Set(stableReleases.map((r) => toAppVersionNumber(r.tagName)));
const parts = [];
parts.push('<?xml version="1.0" encoding="UTF-8" standalone="no"?>');
parts.push("<praktiKST>");
const latestTag = stable ? stable.tagName : null;
const winFilename = latestTag ? `praktiKST-${latestTag}-windows-x64.zip` : "";
parts.push(" <latestVersion>");
if (stable) {
const latestIssues = await getIssuesForRelease("1970-01-01T00:00:00Z", stable.publishedAt);
parts.push(` <versionNumber>${escapeXml(toAppVersionNumber(latestTag))}</versionNumber>`);
parts.push(" <adminMessage></adminMessage>");
parts.push(` <majorChanges>${escapeXml(latestIssues.added.slice(0, 300))}</majorChanges>`);
parts.push(
` <latestVersionPathOnWebserver>https://github.com/${REPO}/releases/download/${latestTag}/${winFilename}</latestVersionPathOnWebserver>`
);
}
parts.push(" </latestVersion>");
// UpdateChecker.parseUpdateXMLFile() never actually reads this field
// (setNeedUpdateResourcesSinceLastVersion is never called); the
// previous server always hardcoded "nothing" here, so we match that.
parts.push(" <needUpdateSinceLastVersion>");
parts.push(" <filename>nothing</filename>");
parts.push(" </needUpdateSinceLastVersion>");
for (const section of loadLegacySections()) {
parts.push(section);
}
for (let i = 0; i < stableReleases.length; i++) {
const rel = stableReleases[i];
const until = rel.publishedAt;
const since = stableReleases[i + 1] ? stableReleases[i + 1].publishedAt : "1970-01-01T00:00:00Z";
const issues = await getIssuesForRelease(since, until);
parts.push(" <changeLog>");
parts.push(` <changedVersionNumber>${escapeXml(toAppVersionNumber(rel.tagName))}</changedVersionNumber>`);
parts.push(` <date>${escapeXml(until.slice(0, 10))}</date>`);
parts.push(` <description>${escapeXml(rel.name)}</description>`);
parts.push(` <added>${escapeXml(issues.added)}</added>`);
parts.push(` <changed>${escapeXml(cleanReleaseBody(rel.body))}</changed>`);
parts.push(` <fixed>${escapeXml(issues.fixed)}</fixed>`);
parts.push(" <removed></removed>");
parts.push(" </changeLog>");
}
for (const entry of historyEntries) {
const version = historyEntryVersion(entry);
if (version && ghVersions.has(version)) continue;
parts.push(entry);
}
parts.push("</praktiKST>");
return parts.join("\n");
} catch (err) {
console.warn(`[versionInfo] Could not generate version info XML, using empty fallback: ${err.message}`);
return fallback;
}
};
+5
View File
@@ -0,0 +1,5 @@
---
permalink: /kst4ContestVersionInfo.xml
eleventyExcludeFromCollections: true
---
{{ versionInfo | safe }}