69 lines
2.2 KiB
GDScript
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
|