145 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
{% extends 'pageWrapper.html' %}
 | 
						|
{% import "macros.html" as macros %}
 | 
						|
{% block head %}
 | 
						|
    <title>Multiworld {{ room.id|suuid }}</title>
 | 
						|
    {% if should_refresh %}<meta http-equiv="refresh" content="2">{% endif %}
 | 
						|
    <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 %}
 | 
						|
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/hostRoom.css") }}"/>
 | 
						|
{% endblock %}
 | 
						|
 | 
						|
{% block body %}
 | 
						|
    {% include 'header/grassHeader.html' %}
 | 
						|
    <div id="host-room">
 | 
						|
        {% if room.owner == session["_id"] %}
 | 
						|
            Room created from <a href="{{ url_for("view_seed", seed=room.seed.id) }}">Seed #{{ room.seed.id|suuid }}</a>
 | 
						|
            <br />
 | 
						|
        {% endif %}
 | 
						|
        {% if room.tracker %}
 | 
						|
            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.
 | 
						|
            <br />
 | 
						|
        {% endif %}
 | 
						|
        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>
 | 
						|
        {% 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 %}
 | 
						|
            You can connect to this room by using <span class="interactive"
 | 
						|
            data-tooltip="This means address/ip is {{ config['HOST_ADDRESS'] }} and port is {{ room.last_port }}.">
 | 
						|
            '/connect {{ config['HOST_ADDRESS'] }}:{{ room.last_port }}'
 | 
						|
            </span>
 | 
						|
            in the <a href="{{ url_for("tutorial_landing")}}">client</a>.<br>
 | 
						|
        {% endif %}
 | 
						|
        {{ macros.list_patches_room(room) }}
 | 
						|
        {% if room.owner == session["_id"] %}
 | 
						|
            <div style="display: flex; align-items: center;">
 | 
						|
                <form method="post" id="command-form" style="flex-grow: 1; margin-right: 1em;">
 | 
						|
                    <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>
 | 
						|
        {%  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");
 | 
						|
 | 
						|
          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);
 | 
						|
                }
 | 
						|
              }
 | 
						|
            }
 | 
						|
            finally {
 | 
						|
              window.clearTimeout(updateLogTimeout);
 | 
						|
              updateLogTimeout = window.setTimeout(updateLog, awaitingCommandResponse ? 500 : 10000);
 | 
						|
            }
 | 
						|
          }
 | 
						|
 | 
						|
          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);
 | 
						|
            }
 | 
						|
          }
 | 
						|
 | 
						|
          document.getElementById("command-form").addEventListener("submit", postForm);
 | 
						|
          updateLogTimeout = window.setTimeout(updateLog, 1000);
 | 
						|
          logger.scrollTop = logger.scrollHeight;
 | 
						|
        </script>
 | 
						|
        {% endif %}
 | 
						|
    </div>
 | 
						|
{% endblock %}
 |