<?xml version="1.0" encoding="utf-8"?>
	<rss version="2.0">
		<channel> 
			<title>История коммерческой редакции CMS Donate Engine</title> 
			<link>https://cde.by/ru/news/</link> 
			<description>Здесь Вы можете ознакомиться с историей изменений в CMS Donate Engine.</description>
			<item>
				<title>v19.2.42</title>
				<description><![CDATA[feat(store): name the server in player-offline message]]></description>
				<files><![CDATA[Total: 5 files (+1, ~4, -0)

www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19241.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/
  M StorePurchaseService.php
www/src/app/lib/
  M Template.php
www/src/app/lib/rcon/
  M PlaceholderResolver.php]]></files>
				<pubDate>Tue, 13 Oct 2026 08:56:46 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.40</title>
				<description><![CDATA[fix(store): route GiveQueue to RCON, classify placeholder failures, read member fields from main db
GiveType::fromGive mapped GiveQueue to Inventory, so store purchases went
through the wrong delivery path. Placeholder failures were indistinguishable,
surfacing server unavailable for missing Steam. Member fields were read
through the money connection without cache. ValidatePayment duplicated the
identity check.
- GiveType: GiveQueue !92 Rcon
- PlaceholderResolver: PlaceholderKind (Identity/Presence/Runtime/Unknown)
  and a single missingIdentity() preflight
- RconGive: match on PlaceholderKind, no preflight duplication
- StorePurchaseService: take CurrentUser, drop flat fields and ValidatePayment
- MemberDataFactory/memberData: split $mainDb from $moneyDb
- CurrentUser::getServerAuth()
- Frontend: SteamID as placeholder, not value]]></description>
				<files><![CDATA[Total: 28 files (+2, ~24, -2)

www/public/style/gente/js/
  M shop.js
www/public/style/gente/mods/store/
  M admin_modal_edit_product.tpl
  M form_donate.tpl
  M index.tpl
  M product_server_group.tpl
  M products_catalog.tpl
  A script.js
  D script.tpl
www/src/app/
  M constants.php
www/src/app/config/
  M services.php
www/src/app/controllers/
  M lisf.php
  M lisfmarket.php
  M oxide.php
  M oxidemarket.php
www/src/app/Features/Store/Http/
  M StoreApiController.php
  M StoreCatalogController.php
www/src/app/Features/Store/Purchase/
  M StorePurchaseService.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M GiveType.php
  M RconGive.php
www/src/app/lib/
  M MemberDataFactory.php
  M Template.php
  M memberData.php
www/src/app/lib/rcon/
  A PlaceholderKind.php
  M PlaceholderNotResolvedException.php
  M PlaceholderResolver.php
  D ValidatePayment.php
www/src/app/lib/session/
  M CurrentUser.php]]></files>
				<pubDate>Mon, 12 Oct 2026 23:33:43 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.39</title>
				<description><![CDATA[fix(http): return 405 for routing MethodNotAllowedException]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/Http/
  M RequestHandler.php]]></files>
				<pubDate>Mon, 12 Oct 2026 17:29:18 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.38</title>
				<description><![CDATA[fix(admin): layout alignment and Response support

- restore text-right on #naviButtons for legacy float-based toolbars
- wrap cron navi in d-inline-flex to prevent button collapse
- capture controller return value in AdminRunner and pass Response
  through, matching FrontRunner behaviour]]></description>
				<files><![CDATA[Total: 6 files (+0, ~6, -0)

www/public/style/lte3/
  M admin_layout.tpl
  M admin_pjax.tpl
www/public/style/lte3/views/cron/
  M navi.tpl
www/src/admin/
  M AdminRunner.php
www/src/admin/controllers/
  M cron.php
www/src/app/
  M constants.php]]></files>
				<pubDate>Mon, 12 Oct 2026 07:09:52 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.37</title>
				<description><![CDATA[feat(store): distinguish missing identity from offline player

When the account has neither a Steam id nor a server auth id, the
store cannot identify the player in the game at all, but RconGive
returned playerOffline and the UI asked the user to join the server.
Add GiveResult::identityMissing, return it when both steam and
playerServerAuth are empty, and surface STORE_IDENTITY_MISSING from
the purchase match. playerOffline is now returned only when an
identifier exists but the player is not on the server.]]></description>
				<files><![CDATA[Total: 6 files (+1, ~5, -0)

www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19236.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/
  M PurchaseResult.php
  M StorePurchaseService.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M RconGive.php]]></files>
				<pubDate>Mon, 12 Oct 2026 06:26:39 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.35</title>
				<description><![CDATA[fix(store): use Steam auth id and drop undefined from purchase POST

StorePurchaseService read $_SESSION[steam_id] (linked profile) instead
of $_SESSION[STEAMID] (Steam auth), so userIsOnline() missed players
who were online.
form_submit_ajax unconditionally read #username_inp, #steam_inp and
#server_auth; .val() returned undefined for absent fields and the
literal undefined went into every purchase request.
Prefer STEAMID when building GiveContext, coalesce the three lookups and ignore the literal undefined on the server side.]]></description>
				<files><![CDATA[Total: 7 files (+0, ~7, -0)

www/public/style/gente/js/
  M shop.js
www/src/app/
  M constants.php
www/src/app/Features/Store/Http/
  M StoreApiController.php
www/src/app/Features/Store/Purchase/
  M StorePurchaseService.php
www/src/app/lib/
  M Template.php
www/src/app/lib/rcon/
  M Facade.php
  M Rcon7dtd.php]]></files>
				<pubDate>Mon, 12 Oct 2026 05:56:32 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.34</title>
				<description><![CDATA[fix(store/give): reject offline RCON delivery instead of silently queueing]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M RconGive.php]]></files>
				<pubDate>Sun, 11 Oct 2026 18:02:44 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.33</title>
				<description><![CDATA[fix(store/purchase): handle player_off and not_deliverable statuses explicitly]]></description>
				<files><![CDATA[Total: 7 files (+1, ~6, -0)

www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19232.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/
  M PurchaseResult.php
  M StorePurchaseService.php
www/src/app/Features/Store/Purchase/Give/
  M RconGive.php
www/src/app/Features/Store/Purchase/Ports/
  M ProductStock.php
www/src/app/lib/queue/
  M Service.php]]></files>
				<pubDate>Sun, 11 Oct 2026 17:42:08 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.31</title>
				<description><![CDATA[fix(store/give): return player_off for offline player instead of fake ok]]></description>
				<files><![CDATA[Total: 3 files (+0, ~3, -0)

www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M RconGive.php]]></files>
				<pubDate>Sun, 11 Oct 2026 15:46:56 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.30</title>
				<description><![CDATA[fix(store/give): fail explicitly on unresolved placeholders

PlaceholderResolver previously treated empty placeholder values
null as absent and let them slip through to str_ireplace,
so commands like tele %crossid% ... reached the game server with
literal tokens and the game replied player not found.
- add PlaceholderNotResolvedException with the missing placeholder list
- collect unresolved placeholders before substitution and throw
  instead of emitting a half-built command
- catch it separately in RconGive and return GiveResult::notDeliverable
  instead of misleading serverOffline
- persist the failure via PurchaseLog::writePlaceholderFailure]]></description>
				<files><![CDATA[Total: 9 files (+1, ~8, -0)

www/public/style/lte3/views/rcon/
  M list.tpl
www/src/admin/controllers/
  M cron.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M RconGive.php
www/src/app/Features/Store/Purchase/Ports/
  M LogStoreAdapter.php
  M PurchaseLog.php
www/src/app/lib/rcon/
  A PlaceholderNotResolvedException.php
  M PlaceholderResolver.php]]></files>
				<pubDate>Sun, 11 Oct 2026 15:35:38 +0300</pubDate>
			</item>
		</channel>
	</rss>