View difference between Paste ID: hL9VCvSD and LHYvxrWm
SHOW: | | - or go back to the newest paste.
1
--[[
2
3
Создано командой SOCC company
4
Nightmare_Night
5
6
P.S. Программа написана на скорую руку
7
Просьба тапками не кидаться
8
9
P.S.S. Функция получения времени хост-машины была взята из API ECS
10
11
]]--
12
13
local component = require("component")
14
local term = require("term")
15
local event = require("event")
16
local fs = require("filesystem")
17
18
local gpu = component.gpu
19
20
local LOG_PATH = "chat_log.txt"
21
22
-- Конвертирует строку в массив
23
function stringToArray(text)
24
  t = {}
25
  text:gsub(".",function(c) table.insert(t,c) end)
26
  return t
27
end
28
29
--Получить текущее реальное время компьютера, хостящего сервер майна
30
function getHostTime(timezone)
31
	timezone = timezone or 2
32
    local file = io.open("/HostTime.tmp", "w")
33
    file:write("")
34
    file:close()
35
    local timeCorrection = timezone * 3600
36
    local lastModified = tonumber(string.sub(fs.lastModified("/HostTime.tmp"), 1, -4)) + timeCorrection
37
    fs.remove("/HostTime.tmp")
38
    local year, month, day, hour, minute, second = os.date("%Y", lastModified), os.date("%m", lastModified), os.date("%d", lastModified), os.date("%H", lastModified), os.date("%M", lastModified), os.date("%S", lastModified)
39
    return tonumber(day), tonumber(month), tonumber(year), tonumber(hour), tonumber(minute), tonumber(second)
40
end
41
42
-- Получет настоящее время, стоящее на Хост-машине
43
function real_time()
44
  local time = {getHostTime(3)}
45
  local text = string.format("%02d:%02d:%02d", time[4], time[5], time[6])
46
  return text
47
end
48
49
-- Проверяет является ли текст окрашенным
50
function isColored(text)
51
  for pos, i in pairs(stringToArray(text)) do
52
    if (i ~= "&") then
53
      if (i ~= " ") then
54
        return false
55
      end
56
    else
57
      return true
58
    end
59
  end
60
61
  return true
62
end
63
64
-- Проверяет в глобальном ли чате написано сообщение
65
function isGlobal(text)
66
  for pos, i in pairs(stringToArray(text)) do
67
    if (i ~= "!") then
68
      if (i ~= " ") then
69
        return false
70
      end
71
    else
72
      return true, pos
73
    end
74
  end
75
  return false
76
end
77
78
-- Делит строку на части
79
function split(str, pat)
80
   local t = {}
81
   local fpat = "(.-)" .. pat
82
   local last_end = 1
83
   local s, e, cap = str:find(fpat, 1)
84
   while s do
85
      if s ~= 1 or cap ~= "" then
86
      table.insert(t,cap)
87
      end
88
      last_end = e+1
89
      s, e, cap = str:find(fpat, last_end)
90
   end
91
   if last_end <= #str then
92
      cap = str:sub(last_end)
93
      table.insert(t, cap)
94
   end
95
   return t
96
end
97
98
-- Устанавливает цвет шрифта в зависимости от патерна
99
function setColor(num)
100
  if (num == "0") then
101
    gpu.setForeground(0x333333)
102
  end
103
104
  if (num == "1") then
105
    gpu.setForeground(0x000099)
106
  end
107
108
  if (num == "2") then
109
    gpu.setForeground(0x006600)
110
  end
111
112
  if (num == "3") then
113
    gpu.setForeground(0x006666)
114
  end
115
116
  if (num == "4") then
117
    gpu.setForeground(0x660000)
118
  end
119
120
  if (num == "5") then
121
    gpu.setForeground(0x660066)
122
  end
123
124
  if (num == "6") then
125
    gpu.setForeground(0xFF8000)
126
  end
127
128
  if (num == "7") then
129
    gpu.setForeground(0xA0A0A0)
130
  end
131
132
  if (num == "8") then
133
    gpu.setForeground(0x404040)
134
  end
135
136
  if (num == "9") then
137
    gpu.setForeground(0x3399FF)
138
  end
139
140
  if (num == "a") then
141
    gpu.setForeground(0x99FF33)
142
  end
143
144
  if (num == "b") then
145
    gpu.setForeground(0x00FFFF)
146
  end
147
148
  if (num == "c") then
149
    gpu.setForeground(0xFF3333)
150
  end
151
152
  if (num == "d") then
153
    gpu.setForeground(0xFF00FF)
154
  end
155
156
  if (num == "e") then
157
    gpu.setForeground(0xFFFF00)
158
  end
159
160
  if (num == "f") then
161
    gpu.setForeground(0xFFFFFF)
162
  end
163
end
164
165
-- Выводит сообщение
166
function writeMessage(text)  
167
    local t = split(text, "&")
168
    for pos, i in pairs(t) do
169
      if (pos == 1 and not isColored(text)) then
170
        io.write(i)
171
      else
172
        setColor(string.sub(i, 1, 1))
173
        io.write(string.sub(i, 2))
174
      end
175
    end
176
end
177
178
-- Выводит остальную часть сообщения
179
function message(nick, msg, isGlobal, pos)
180
  local type = ""
181
  if (isGlobal) then msg = string.sub(msg, pos + 1) type = "G" else type = "L" end
182
183
  local file = fs.open(LOG_PATH, "a")
184
  file:write("[" .. real_time() .. "] [" .. type .. "] " .. nick .. ": " .. msg .. "\n")
185
  file:close()
186
187
  gpu.setForeground(0x00FFFF)
188
  io.write("[" .. real_time() .. "] ")
189
  gpu.setForeground(0xFFFFFF)
190
  if (type == "G") then
191
    gpu.setForeground(0xFF9933)
192
  else
193
    gpu.setForeground(0xFFFFFF)
194
  end
195
  io.write("[" .. type .. "] ")
196
  gpu.setForeground(0x00FF00)
197
  io.write(nick)
198
  gpu.setForeground(0xFFFFFF)
199
  io.write(": ")
200
  writeMessage(msg, l)
201
  io.write("\n")
202
end
203
204
print("Инициализация...")
205
os.sleep(1)
206
print("Ожидание первого сообщения...")
207
208
local _, add, nick, msg = event.pull("chat_message") 
209
term.clear()
210
local type, pos = isGlobal(msg)
211
message(nick, msg, type, pos)
212
213
214
while true do
215
216
  local _, add, nick, msg = event.pull("chat_message") 
217
  local type, pos = isGlobal(msg)
218
  message(nick, msg, type, pos)
219
220
end