LssBrowser.gd 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. extends VBoxContainer
  2. var page_number := 1
  3. @onready var http_request: HTTPRequest = $HTTPRequest
  4. const LSS_URL := "https://levelsharesquare.com"
  5. signal closed
  6. signal level_selected(container: OnlineLevelContainer)
  7. var list := {}
  8. const ONLINE_LEVEL_CONTAINER = preload("uid://cr2pku7fjkgpo")
  9. var filter = 0
  10. var selected_lvl_idx := -1
  11. var sort := -1
  12. func _ready() -> void:
  13. set_process(false)
  14. func open(refresh_list := true) -> void:
  15. show()
  16. if refresh_list:
  17. grab_levels()
  18. await get_tree().physics_frame
  19. if selected_lvl_idx >= 0:
  20. %OnlineLevelList.get_child(selected_lvl_idx).grab_focus()
  21. else:
  22. %RefreshList.grab_focus()
  23. set_process(true)
  24. func _process(_delta: float) -> void:
  25. if Input.is_action_just_pressed("ui_back"):
  26. closed.emit()
  27. close()
  28. func close() -> void:
  29. set_process(false)
  30. hide()
  31. func grab_levels() -> void:
  32. selected_lvl_idx = -1
  33. %OverloadMSG.hide()
  34. %ErrorMSG.hide()
  35. http_request.cancel_request()
  36. for i in %OnlineLevelList.get_children():
  37. i.queue_free()
  38. $LoadingMSG.show()
  39. var filter_str = ["", "", "&sort=plays", "&sort=rating"][filter]
  40. var get_type = ["featured?", "get?", "get?", "get?"][filter]
  41. var page_str = "&page=" + str(page_number)
  42. var url = LSS_URL + "/api/levels/filter/" + get_type + "game=" + str(Global.LSS_GAME_ID) + "&authors=1" + filter_str + page_str + "&sortType=" + str(sort)
  43. http_request.request(url, [], HTTPClient.METHOD_GET)
  44. func level_list_retrieved(result := 0, response_code := 0, headers: PackedStringArray = [], body: PackedByteArray = []) -> void:
  45. $LoadingMSG.hide()
  46. var string = body.get_string_from_utf8()
  47. if response_code != HTTPClient.RESPONSE_OK:
  48. %ErrorMSG.show()
  49. return
  50. if string == "Too many requests, please slow down!":
  51. %OverloadMSG.show()
  52. return
  53. var json = JSON.parse_string(string)
  54. list = json
  55. print(list)
  56. spawn_containers()
  57. %Page.values.clear()
  58. for i in json.numberOfPages:
  59. %Page.values.append(str(int(i + 1)))
  60. func spawn_containers() -> void:
  61. $HSeparator.show()
  62. for i in list.levels:
  63. var container = ONLINE_LEVEL_CONTAINER.instantiate()
  64. container.level_name = i.name
  65. if i.has("status"):
  66. container.featured = i.status == "Featured"
  67. container.level_author = i.author.username
  68. container.difficulty = i.difficulty
  69. container.level_id = i._id
  70. container.level_selected.connect(show_info)
  71. if i.has("thumbnail"):
  72. if i.thumbnail != null:
  73. container.thumbnail_url = i.thumbnail
  74. %OnlineLevelList.add_child(container)
  75. func show_info(container: OnlineLevelContainer) -> void:
  76. selected_lvl_idx = container.get_index()
  77. level_selected.emit(container)
  78. func set_filter(filter_idx := 0) -> void:
  79. filter = filter_idx
  80. grab_levels()
  81. func set_page(page_idx := 0) -> void:
  82. page_number = page_idx + 1
  83. grab_levels()
  84. func set_order(order_idx := 0) -> void:
  85. sort = [-1, 1][order_idx]
  86. grab_levels()