serafim7

чат [OpenComputers]

Nov 1st, 2020 (edited)
117
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[ opencomputers чат by serafim    pastebin.com/GBrch6sX
  2.      для проекта   computercraft.ru        update 05.11.20
  3.  
  4. Чат между двумя компьютерами через модем или связанную плату
  5.  
  6. https://i.imgur.com/Lb3wCV6.png
  7.  
  8. требования:
  9. связанная плата или модем
  10. ]]--
  11.  
  12. local port = 7
  13.  
  14. local com = require("component")
  15. local event = require("event")
  16. local unicode = require("unicode")
  17. local computer = require("computer")
  18. local gpu = com.gpu
  19. local w, h = gpu.getViewport()
  20. local scren_buffer = {}
  21. local text_buffer = ""
  22. local theme = 1
  23. local modem,tunnel
  24.  
  25. gpu.fill(1, 1, w, h, " ")
  26. gpu.set(w / 2 - 3, 1, "Чат")
  27. gpu.set(1, 5, "Enter -- Отправить сообщение")
  28. gpu.set(1, 6, "Alt   -- Смена темы")
  29. gpu.set(1, 7, "Ctrl  -- Выход")
  30. gpu.set(1, h, "> ")
  31.  
  32. if com.isAvailable("tunnel") then
  33.   modem = com.tunnel
  34.   tunnel = true
  35.   gpu.set(1, 10, "связь через связанную плату")
  36. elseif com.isAvailable("modem") then
  37.   modem = com.modem
  38.   modem.open(port)
  39.   tunnel = false
  40.   gpu.set(1, 10, "связь через модем, порт "..port)
  41. else
  42.   os.execute("cls")
  43.   print("нет связанной платы или модема")
  44.   os.exit()
  45. end
  46.  
  47. local function refresh()
  48.   gpu.fill(1, 1, w, h, " ")
  49.   for i, v in ipairs(scren_buffer) do
  50.     gpu.set(1, h-1-i, v)
  51.   end
  52.   gpu.set(1, h, "> "..text_buffer)
  53.   if #scren_buffer > h then
  54.     table.remove(scren_buffer)
  55.   end
  56. end
  57.  
  58. local function receive(_,_,_,_,_,message)
  59.   table.insert(scren_buffer,1,"< "..message)
  60.   refresh()
  61.   computer.beep(300, 0.1)
  62. end
  63.  
  64. local function keydown()
  65.   local e,_,char,key = event.pull(1,"key_down")
  66.   if e == "key_down" then
  67.     if key == 28 or key == 156 then--Enter
  68.       if unicode.len(text_buffer) > 0 then
  69.         table.insert(scren_buffer,1,"> "..text_buffer)
  70.         if tunnel then
  71.           modem.send(text_buffer)
  72.         else
  73.           modem.broadcast(port,text_buffer)
  74.         end
  75.         text_buffer = ""
  76.         refresh()
  77.         return
  78.       end
  79.     elseif key == 29 or key == 157 then--Ctrl
  80.       event.ignore("modem_message", receive)
  81.       gpu.setResolution(w, h)
  82.       gpu.setBackground(0x000000)
  83.       gpu.setForeground(0xFFFFFF)
  84.       os.execute("cls")
  85.       os.exit()
  86.     elseif key == 56 or key == 184 then--Alt
  87.       theme = theme + 1
  88.       if theme == 5 then
  89.         theme = 1
  90.       end
  91.       if theme == 1 then
  92.         gpu.setBackground(0x000000)
  93.         gpu.setForeground(0xFFFFFF)
  94.       elseif theme == 2 then
  95.         gpu.setForeground(0x000000)
  96.         gpu.setBackground(0xFFFFFF)
  97.       elseif theme == 3 then
  98.         gpu.setForeground(0x008000)
  99.         gpu.setBackground(0x000000)
  100.       elseif theme == 4 then
  101.         gpu.setForeground(0x000000)
  102.         gpu.setBackground(0x008000)
  103.       end
  104.       refresh()
  105.     elseif key == 14 then--Backspace
  106.       text_buffer = unicode.sub(text_buffer,0,unicode.len(text_buffer)-1)
  107.     elseif key == 211 then--Del
  108.       text_buffer = ""
  109.     elseif key == 42 or key == 54 then--Shift
  110.       --игнорировать нажатие
  111.     elseif unicode.len(text_buffer) <= w-3 then
  112.       text_buffer = text_buffer..unicode.char(char)
  113.     end
  114.     blink = false
  115.     gpu.set(1, h, "> "..text_buffer)
  116.     gpu.fill(unicode.len(text_buffer)+3, h, w, 1, " ")
  117.   end
  118.   pos = unicode.len(text_buffer)+3
  119.   blink = not blink
  120.   if blink then
  121.     gpu.set(pos,h,"█")
  122.   else
  123.     gpu.set(pos,h," ")
  124.   end
  125. end
  126.  
  127. event.listen("modem_message", receive)
  128. while true do
  129.   keydown()
  130. end
RAW Paste Data