Files
tekton/launcher/scripts/news_fetcher.gd
T
2025-12-10 02:35:17 +08:00

69 lines
2.2 KiB
GDScript

extends Node
class_name NewsFetcher
## Fetches news/devlog entries from itch.io
signal news_fetched(news_items: Array)
signal news_fetch_failed(error: String)
var http_request: HTTPRequest
# itch.io doesn't have a public devlog API, so we'll fetch from a custom endpoint
# You can host this JSON alongside your game files on itch.io
func _ready() -> void:
http_request = HTTPRequest.new()
add_child(http_request)
http_request.request_completed.connect(_on_request_completed)
func fetch_news() -> void:
# Fetch from the version manifest which includes news
print("[NewsFetcher] Fetching news from manifest...")
var error := http_request.request(Config.VERSION_MANIFEST_URL)
if error != OK:
emit_signal("news_fetch_failed", "Failed to initiate news request")
func _on_request_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
if result != HTTPRequest.RESULT_SUCCESS:
emit_signal("news_fetch_failed", "Network error fetching news")
return
if response_code != 200:
emit_signal("news_fetch_failed", "Server returned error: " + str(response_code))
return
var json := JSON.new()
var parse_result := json.parse(body.get_string_from_utf8())
if parse_result != OK:
emit_signal("news_fetch_failed", "Failed to parse news data")
return
var data: Dictionary = json.data
var news_items: Array = data.get("news", [])
# Also include recent releases as news items
var releases: Array = data.get("releases", [])
for release in releases:
news_items.append({
"title": "Version " + release.get("version", "?") + " Released!",
"date": release.get("date", ""),
"content": _format_changelog(release.get("changelog", [])),
"type": "release"
})
# Sort by date descending
news_items.sort_custom(_sort_by_date)
print("[NewsFetcher] Fetched ", news_items.size(), " news items")
emit_signal("news_fetched", news_items)
func _format_changelog(changelog: Array) -> String:
var text := ""
for item in changelog:
text += "• " + str(item) + "\n"
return text.strip_edges()
func _sort_by_date(a: Dictionary, b: Dictionary) -> bool:
var date_a: String = a.get("date", "")
var date_b: String = b.get("date", "")
return date_a > date_b # Descending order