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
|
defmodule Chessh.SSH.Client.TrongleChat do
require Logger
alias Chessh.{Player, Chat, Utils, Repo, PlayerSession}
import Ecto.Query
defmodule State do
defstruct client_pid: nil,
message: "",
player_session: nil,
chats: []
end
use Chessh.SSH.Client.Screen
defp get_initial_chats() do
from(c in Chat,
order_by: [desc: c.id],
limit: 100
)
|> Repo.all()
|> Repo.preload([:chatter])
end
def get_player(%PlayerSession{player_id: player_id} = player_session) do
Repo.get!(Player, player_id)
end
def init([%State{client_pid: client_pid, player_session: player_session} = state]) do
:syn.add_node_to_scopes([:chat])
:ok = :syn.join(:chat, {:tronglechat}, self())
send(client_pid, {:send_to_ssh, Utils.clear_codes()})
chats = get_initial_chats()
{:ok,
%State{
state
| chats: chats,
player_session: %PlayerSession{player_session | player: get_player(player_session)}
}}
end
def render(
width,
height,
%State{
client_pid: client_pid,
chats: chats,
message: message,
player_session: %PlayerSession{player: %Player{username: username}} = player_session
} = state
) do
send(client_pid, {:send_to_ssh, [Utils.clear_codes(), username <> "> " <> message]})
state
end
def input(width, height, action, data, %State{message: message} = state) do
appended_message =
case action do
:backspace ->
%State{state | message: String.slice(message, 0..-2)}
_ ->
if String.match?(data, ~r/[a-zA-Z \.-]/) do
%State{state | message: message <> data}
else
state
end
end
render(width, height, appended_message)
end
end
|