| 
									
										
										
										
											2020-10-24 14:46:27 -04:00
										 |  |  | {% extends 'pageWrapper.html' %} | 
					
						
							| 
									
										
										
										
											2020-08-02 22:11:52 +02:00
										 |  |  | {% import "macros.html" as macros %} | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | {% block head %} | 
					
						
							| 
									
										
										
										
											2020-07-27 05:04:49 +02:00
										 |  |  |     <title>Multiworld {{ room.id|suuid }}</title> | 
					
						
							| 
									
										
										
										
											2022-08-12 04:55:40 +02:00
										 |  |  |     {% if should_refresh %}<meta http-equiv="refresh" content="2">{% endif %} | 
					
						
							| 
									
										
										
										
											2023-12-17 06:08:40 +01:00
										 |  |  |     <meta name="og:site_name" content="Archipelago"> | 
					
						
							|  |  |  |     <meta property="og:title" content="Multiworld {{ room.id|suuid }}"> | 
					
						
							|  |  |  |     <meta property="og:type" content="website" /> | 
					
						
							|  |  |  |     {% if room.seed.slots|length < 2 %} | 
					
						
							|  |  |  |     <meta property="og:description" content="{{ room.seed.slots|length }} Player World | 
					
						
							|  |  |  |     {% if room.last_port != -1 %}running on {{ config['HOST_ADDRESS'] }} with port {{ room.last_port }}{% endif %}"> | 
					
						
							|  |  |  |     {% else %} | 
					
						
							|  |  |  |     <meta property="og:description" content="{{ room.seed.slots|length }} Players Multiworld | 
					
						
							|  |  |  |     {% if room.last_port != -1 %}running on {{ config['HOST_ADDRESS'] }} with port {{ room.last_port }}{% endif %}"> | 
					
						
							|  |  |  |     {% endif %} | 
					
						
							| 
									
										
										
										
											2021-05-13 00:41:49 +02:00
										 |  |  |     <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/hostRoom.css") }}"/> | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | {% endblock %} | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | {% block body %} | 
					
						
							| 
									
										
										
										
											2020-12-03 01:55:06 -05:00
										 |  |  |     {% include 'header/grassHeader.html' %} | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |     <div id="host-room"> | 
					
						
							|  |  |  |         {% if room.owner == session["_id"] %} | 
					
						
							| 
									
										
										
										
											2021-11-25 20:48:58 +01:00
										 |  |  |             Room created from <a href="{{ url_for("view_seed", seed=room.seed.id) }}">Seed #{{ room.seed.id|suuid }}</a> | 
					
						
							| 
									
										
											  
											
												Website Style Upgrade (#353)
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* Seed download page improvements
* Add styles to weighted-settings page
* Minor adjustments to styles
* Revert base theme to grass
* Add more items to ArchipIDLE
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* Seed download page improvements
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* Add styles to weighted-settings page
* Minor adjustments to styles
* Revert base theme to grass
* Add more items to ArchipIDLE
* Improve Archipidle item name
* [WebHost] Update background images, waiting on jungle.png, added partyTime theme
* [WebHost] Fix tab ordering on landing page, remove islands on screen scale, fix tutorial page width scaling
* [WebHost] Final touches to WebHost
* Improve get_world_theme function, add partyTime theme to ArchipIDLE WebWorld
* Remove sending_visible from AutoWorld
* AP Ocarina of Time Client (#352)
* Core: update jinja (#351)
* some typing and cleaning, mostly in Fill.py (#349)
* some typing and cleaning, mostly in Fill.py
* address missing Option types
* resolve a few TODOs discussed in pull request
* SM: Optimize a bit (#350)
* SM: Optimize a bit
* SM: init bosses only once
* New World Order (#355)
* Core: update jinja
* SM: Optimize a bit
* AutoWorld: import worlds in alphabetical order, to be predictable rather than arbitrary
Co-authored-by: Hussein Farran <hmfarran@gmail.com>
* Remove references to Z5Client in English OoT setup guide
* Prevent markdown code blocks from overflowing their container
Co-authored-by: espeon65536 <81029175+espeon65536@users.noreply.github.com>
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>
Co-authored-by: Hussein Farran <hmfarran@gmail.com>
											
										 
											2022-03-28 20:12:17 -04:00
										 |  |  |             <br /> | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |         {% endif %} | 
					
						
							|  |  |  |         {% if room.tracker %} | 
					
						
							| 
									
										
										
										
											2024-06-01 14:43:11 +02:00
										 |  |  |             This room has a <a href="{{ url_for("get_multiworld_tracker", tracker=room.tracker) }}">Multiworld Tracker</a> | 
					
						
							|  |  |  |             and a <a href="{{ url_for("get_multiworld_sphere_tracker", tracker=room.tracker) }}">Sphere Tracker</a> enabled. | 
					
						
							| 
									
										
											  
											
												Website Style Upgrade (#353)
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* Seed download page improvements
* Add styles to weighted-settings page
* Minor adjustments to styles
* Revert base theme to grass
* Add more items to ArchipIDLE
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* Seed download page improvements
* [WebHost] Update WebHost to include modular themes system, remove unused and outdated assets
* Landing Page Updates
* Markdown updates, colors coming later
* Remove testing theme from FF1
* Color updates for markdown styles
* Updates to generated pages, so many updates
* Add styles to weighted-settings page
* Minor adjustments to styles
* Revert base theme to grass
* Add more items to ArchipIDLE
* Improve Archipidle item name
* [WebHost] Update background images, waiting on jungle.png, added partyTime theme
* [WebHost] Fix tab ordering on landing page, remove islands on screen scale, fix tutorial page width scaling
* [WebHost] Final touches to WebHost
* Improve get_world_theme function, add partyTime theme to ArchipIDLE WebWorld
* Remove sending_visible from AutoWorld
* AP Ocarina of Time Client (#352)
* Core: update jinja (#351)
* some typing and cleaning, mostly in Fill.py (#349)
* some typing and cleaning, mostly in Fill.py
* address missing Option types
* resolve a few TODOs discussed in pull request
* SM: Optimize a bit (#350)
* SM: Optimize a bit
* SM: init bosses only once
* New World Order (#355)
* Core: update jinja
* SM: Optimize a bit
* AutoWorld: import worlds in alphabetical order, to be predictable rather than arbitrary
Co-authored-by: Hussein Farran <hmfarran@gmail.com>
* Remove references to Z5Client in English OoT setup guide
* Prevent markdown code blocks from overflowing their container
Co-authored-by: espeon65536 <81029175+espeon65536@users.noreply.github.com>
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>
Co-authored-by: Hussein Farran <hmfarran@gmail.com>
											
										 
											2022-03-28 20:12:17 -04:00
										 |  |  |             <br /> | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |         {% endif %} | 
					
						
							| 
									
										
										
										
											2022-07-18 21:10:29 +02:00
										 |  |  |         The server for this room will be paused after {{ room.timeout//60//60 }} hours of inactivity. | 
					
						
							|  |  |  |         Should you wish to continue later, | 
					
						
							|  |  |  |         anyone can simply refresh this page and the server will resume.<br> | 
					
						
							| 
									
										
										
										
											2022-11-04 19:19:04 +01:00
										 |  |  |         {% if room.last_port == -1 %} | 
					
						
							|  |  |  |             There was an error hosting this Room. Another attempt will be made on refreshing this page. | 
					
						
							|  |  |  |             The most likely failure reason is that the multiworld is too old to be loaded now. | 
					
						
							|  |  |  |         {% elif room.last_port %} | 
					
						
							| 
									
										
										
										
											2022-05-24 00:20:02 +02:00
										 |  |  |             You can connect to this room by using <span class="interactive" | 
					
						
							| 
									
										
										
										
											2023-03-09 21:31:00 +01:00
										 |  |  |             data-tooltip="This means address/ip is {{ config['HOST_ADDRESS'] }} and port is {{ room.last_port }}."> | 
					
						
							|  |  |  |             '/connect {{ config['HOST_ADDRESS'] }}:{{ room.last_port }}' | 
					
						
							| 
									
										
										
										
											2022-05-24 00:20:02 +02:00
										 |  |  |             </span> | 
					
						
							| 
									
										
										
										
											2022-11-04 19:19:04 +01:00
										 |  |  |             in the <a href="{{ url_for("tutorial_landing")}}">client</a>.<br> | 
					
						
							|  |  |  |         {% endif %} | 
					
						
							| 
									
										
										
										
											2022-02-23 19:16:45 +01:00
										 |  |  |         {{ macros.list_patches_room(room) }} | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |         {% if room.owner == session["_id"] %} | 
					
						
							| 
									
										
										
										
											2023-04-21 15:12:43 +02:00
										 |  |  |             <div style="display: flex; align-items: center;"> | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |                 <form method="post" id="command-form" style="flex-grow: 1; margin-right: 1em;"> | 
					
						
							| 
									
										
										
										
											2023-04-21 15:12:43 +02:00
										 |  |  |                     <div class="form-group"> | 
					
						
							|  |  |  |                         <label for="cmd"></label> | 
					
						
							|  |  |  |                         <input class="form-control" type="text" id="cmd" name="cmd" | 
					
						
							|  |  |  |                                placeholder="Server Command. /help to list them, list gets appended to log."> | 
					
						
							|  |  |  |                     </div> | 
					
						
							|  |  |  |                 </form> | 
					
						
							|  |  |  |                 <a href="{{ url_for("display_log", room=room.id) }}"> | 
					
						
							|  |  |  |                     Open Log File... | 
					
						
							|  |  |  |                 </a> | 
					
						
							|  |  |  |             </div> | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |         {%  set log = get_log() -%} | 
					
						
							|  |  |  |         {%- set log_len = log | length - 1 if log.endswith("…") else log | length -%} | 
					
						
							|  |  |  |         <div id="logger" style="white-space: pre">{{ log }}</div> | 
					
						
							|  |  |  |         <script> | 
					
						
							|  |  |  |           let url = '{{ url_for('display_log', room = room.id) }}'; | 
					
						
							|  |  |  |           let bytesReceived = {{ log_len }}; | 
					
						
							|  |  |  |           let updateLogTimeout; | 
					
						
							|  |  |  |           let awaitingCommandResponse = false; | 
					
						
							|  |  |  |           let logger = document.getElementById("logger"); | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |           function scrollToBottom(el) { | 
					
						
							|  |  |  |             let bot = el.scrollHeight - el.clientHeight; | 
					
						
							|  |  |  |             el.scrollTop += Math.ceil((bot - el.scrollTop)/10); | 
					
						
							|  |  |  |             if (bot - el.scrollTop >= 1) { | 
					
						
							|  |  |  |               window.clearTimeout(el.scrollTimer); | 
					
						
							|  |  |  |               el.scrollTimer = window.setTimeout(() => { | 
					
						
							|  |  |  |                 scrollToBottom(el) | 
					
						
							|  |  |  |               }, 16); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           async function updateLog() { | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |               let res = await fetch(url, { | 
					
						
							|  |  |  |                 headers: { | 
					
						
							|  |  |  |                   'Range': `bytes=${bytesReceived}-`, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               }); | 
					
						
							|  |  |  |               if (res.ok) { | 
					
						
							|  |  |  |                 let text = await res.text(); | 
					
						
							|  |  |  |                 if (text.length > 0) { | 
					
						
							|  |  |  |                   awaitingCommandResponse = false; | 
					
						
							|  |  |  |                   if (bytesReceived === 0 || res.status !== 206) { | 
					
						
							|  |  |  |                     logger.innerHTML = ''; | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   if (res.status !== 206) { | 
					
						
							|  |  |  |                     bytesReceived = 0; | 
					
						
							|  |  |  |                   } else { | 
					
						
							|  |  |  |                     bytesReceived += new Blob([text]).size; | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   if (logger.innerHTML.endsWith('…')) { | 
					
						
							|  |  |  |                     logger.innerHTML = logger.innerHTML.substring(0, logger.innerHTML.length - 1); | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   logger.appendChild(document.createTextNode(text)); | 
					
						
							|  |  |  |                   scrollToBottom(logger); | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             finally { | 
					
						
							|  |  |  |               window.clearTimeout(updateLogTimeout); | 
					
						
							|  |  |  |               updateLogTimeout = window.setTimeout(updateLog, awaitingCommandResponse ? 500 : 10000); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |           async function postForm(ev) { | 
					
						
							|  |  |  |             /** @type {HTMLInputElement} */ | 
					
						
							|  |  |  |             let cmd = document.getElementById("cmd"); | 
					
						
							|  |  |  |             if (cmd.value === "") { | 
					
						
							|  |  |  |               ev.preventDefault(); | 
					
						
							|  |  |  |               return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             /** @type {HTMLFormElement} */ | 
					
						
							|  |  |  |             let form = document.getElementById("command-form"); | 
					
						
							|  |  |  |             let req = fetch(form.action || window.location.href, { | 
					
						
							|  |  |  |               method: form.method, | 
					
						
							|  |  |  |               body: new FormData(form), | 
					
						
							|  |  |  |               redirect: "manual", | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |             ev.preventDefault(); // has to happen before first await | 
					
						
							|  |  |  |             form.reset(); | 
					
						
							|  |  |  |             let res = await req; | 
					
						
							|  |  |  |             if (res.ok || res.type === 'opaqueredirect') { | 
					
						
							|  |  |  |               awaitingCommandResponse = true; | 
					
						
							|  |  |  |               window.clearTimeout(updateLogTimeout); | 
					
						
							|  |  |  |               updateLogTimeout = window.setTimeout(updateLog, 100); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |               window.alert(res.statusText); | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-01 21:47:49 +02:00
										 |  |  |           document.getElementById("command-form").addEventListener("submit", postForm); | 
					
						
							|  |  |  |           updateLogTimeout = window.setTimeout(updateLog, 1000); | 
					
						
							|  |  |  |           logger.scrollTop = logger.scrollHeight; | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |         </script> | 
					
						
							| 
									
										
										
										
											2020-08-02 22:11:52 +02:00
										 |  |  |         {% endif %} | 
					
						
							| 
									
										
										
										
											2020-07-18 23:01:35 -04:00
										 |  |  |     </div> | 
					
						
							|  |  |  | {% endblock %} |