~starkingdoms/starkingdoms

ref: aae675f31d3ca95ec4f678e48e318777b3662200 starkingdoms/starkingdoms-client/src/components/Chatbox.svelte -rw-r--r-- 2.6 KiB
aae675f3 — ghostlyzsh ok now saving saves everything in theory 1 year, 11 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<script lang="ts">
  import Popup from "./ui/Popup.svelte";
  import { type Packet, PacketType } from "../protocol.ts";
  import { sendPacket } from "../hub.ts";
  import { global } from "../globals.js";
  import { afterUpdate } from "svelte";
  import TextInput from "./ui/TextInput.svelte";

  interface Message {
    classname: string;
    message: string;
  }

  let messages: Message[] = [];
  let chatbox: HTMLDivElement | null;
  let value = "";

  export function addMessage(classname: string, message: string) {
    messages.push({ classname: classname, message: message });
    messages = messages; // Trigger Svelte reactivity
  }

  afterUpdate(() => {
    if (chatbox !== null) {
      chatbox.scrollTo(0, chatbox.scrollHeight);
    }
  });

  function onkeydown(e: KeyboardEvent) {
    if (e.key === "Enter") {
      if (value.startsWith(".msg")) {
        let args = value.split(" ");
        if (args.length < 3) {
          addMessage("server-error", "Command error");

          value = "";
          return;
        }
        let target = args[1];
        let message = args.slice(2).join(" ");
        let chat_packet: Packet = {
          t: PacketType.SendMessage,
          c: {
            target: target,
            content: message,
          },
        };
        sendPacket(global.client!, chat_packet);

        addMessage("direct-message", `you -> ${target}: ${message}`);
      } else if (value.startsWith(".save")) {
        value = "";
        addMessage(
          "server-message",
          "[Save][1/3] Requesting save from the server...",
        );
        if (!global.saveEligible) {
          addMessage(
            "server-error",
            "[Save] Not eligible to save, please get closer to a planet",
          );
          return;
        }
        let req_packet: Packet = {
          t: PacketType.RequestSave,
          c: {},
        };
        sendPacket(global.client!, req_packet);
      } else {
        let chat_packet: Packet = {
          t: PacketType.SendMessage,
          c: {
            target: null,
            content: value,
          },
        };
        sendPacket(global.client!, chat_packet);
      }
      value = "";
    }
  }
</script>

<Popup draggable minimizable title="Chat" class="chat-container" id="chat">
  <div bind:this={chatbox} id="chatbox" class="chat-table mono">
    {#each messages as message}
      <p class="message {message.classname}">{message.message}</p>
    {/each}
  </div>
  <TextInput
    bind:value
    on:keydown={onkeydown}
    placeholder="Enter message or command here..."
    class="chat-box"
    id="chatentry"
    required
    autocomplete="off" />
</Popup>