Advertisement
taoshi

pimserver.lua

Jan 20th, 2024
884
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.50 KB | None | 0 0
  1. --pimserver
  2. local pimserver={}
  3. pimserver.version='1.00'
  4. local db={}
  5. local owners={}
  6. local event=require('event')
  7. local modem=require('component').modem
  8. local port = 0xfffe
  9. local send = 0xffef
  10. local fs = require('filesystem')
  11. --local log={}
  12. local serialization = require('serialization')
  13. local terminal={}
  14. local unregistered={}
  15. local gpu = require('component').gpu
  16. modem.open(port)
  17. modem.setWakeMessage="{name="
  18. local player_on = false
  19. local computer=require('computer')
  20. local pullSignal=computer.pullSignal   
  21. computer.pullSignal=function(...)
  22.     local e={pullSignal(...)}
  23.     if e[1]=='modem_message' then
  24.         return pimserver.modem(e)
  25.     end
  26.     if e[1]=='touch' then
  27.         return pimserver.accept(e)
  28.     end
  29.     if e[1]=='player_on' then
  30.         return pimserver.regOwner(e)
  31.     end
  32.     return table.unpack(e)
  33. end
  34.  
  35. function pimserver.modem(e) ---1type 2respondent 3sender 4port 5distance 6message
  36.     local sender=e[3]
  37.     os.sleep(0.05)
  38.     --want to msg fields:
  39.     --msg.number
  40.     --msg.name =name of player
  41.     --msg.op = enter|buy|sell|balanceIn|balanceOut
  42.     --msg.value = value of operation
  43.     local msg = serialization.unserialize(e[6])
  44.   msg.sender = sender
  45.   --регистрация терминалов
  46.   if msg.name and msg.name=='pimmarket' then
  47.         return pimserver[msg.op](sender)
  48.   end
  49.   --проверка валидности адреса посылки
  50.   local valid = false
  51.   for n in pairs(terminal) do
  52.     if terminal[n]==sender then valid = true end
  53.   end
  54.     if not valid then return 'не знаем мы таких' end
  55.     --если такого игрока нет, то запись нового игрока в бд
  56.     if msg.name and not db[msg.name] then pimserver.newUser(msg.name) end
  57.     --если в сообщении есть имя игрока отправляем по типу операции
  58.     if msg.name then return pimserver[msg.op](msg) end
  59.     --поиск отклика завершенных событий
  60.     --if msg.complite==true then return true end
  61.     --остальные события нас не интересуют
  62.     return true
  63. end
  64.  
  65. --постановка терминала в список ожидания регистрации
  66. function pimserver.connect(sender)
  67.     for n in pairs(terminal) do
  68.         --если такой терминал есть в списке валидных
  69.     if terminal[n]==sender then
  70.         return pimserver.returnAccept(sender)
  71.     end
  72.   end
  73.     table.insert(unregistered,sender)
  74.     return pimserver.place()
  75. end
  76. function pimserver.getOwners(sender)
  77.     local msg={sender=sender,number=1,name='pimmarket',balance=0,op='getOwners'}
  78.     msg.owners=owners
  79.     pimserver.post(msg)
  80. end
  81.  
  82. --отсылка подтверждения регистрации
  83. function pimserver.accept(msg)
  84.     local who = msg[6]
  85.     for id in pairs(owners)do
  86.         if owners[id].name == who then
  87.             who = nil
  88.         end
  89.     end
  90.     if who then return true end
  91.    
  92.     local x,y = msg[3],msg[4]
  93.     --if msg[6]==adminname then
  94.     if x < 4 and y == 1 then
  95.         return pimserver.WaitToNewOwner()
  96.     end
  97.     if y < 13 then return true end
  98.     y=y-12
  99.     if x == 3 and y <= #unregistered then
  100.         table.remove(unregistered,y)
  101.     end
  102.     if x == 43 and y <= #unregistered then
  103.         local sender=table.remove(unregistered,y)
  104.         table.insert(terminal, sender)
  105.         pimserver.saveTerminalsToFile()
  106.         return pimserver.returnAccept(sender)
  107.     end
  108.     --end
  109.     return true
  110. end
  111.  
  112. function pimserver.returnAccept(sender)
  113.     local msg={sender=sender,number=1,name='pimmarket',balance=0,op='connect'}
  114.     pimserver.post(msg)
  115.     return pimserver.place()
  116.     end
  117.  
  118. function pimserver.place()
  119.     local x,y = gpu.getResolution()
  120.     gpu.setBackground(0x113311)
  121.     gpu.setForeground(0x58f029)
  122.     gpu.fill(1,1,x,y,' ')
  123.     gpu.set(1,1,'REG: step on PIM for register owner')
  124.     gpu.set(5,1,'Registered terminals:')
  125.     for t in pairs(terminal) do
  126.         gpu.set(5,t+1,terminal[t])
  127.     end
  128.     gpu.set(5,12,'Unregistered terminals:')
  129.     for t in pairs(unregistered) do
  130.         gpu.set(5,t+12,unregistered[t])
  131.         gpu.set(3,t+12,'X')
  132.         gpu.set(43,t+12,'V')
  133.     end
  134.     return true
  135. end
  136.  
  137. --первичная регистрация игрока
  138. function pimserver.enter(msg)
  139.     if not db[msg.name] then pimserver.newUser(msg.name)
  140.         print('new user'..msg.name)
  141.         msg.new='new'
  142.     end
  143.     return pimserver.broadcast(msg)
  144. end
  145.  
  146. --проверка наличия имени в базе данных
  147. function pimserver.isRegistered(msg)
  148.     if not db[msg.name2] then
  149.         msg.op = 'regFalse'
  150.     else
  151.         msg.op = 'regTrue'
  152.     end
  153.     return pimserver.broadcast(msg)
  154. end
  155.  
  156. --перевод со счета на счет
  157. function pimserver.transfer(msg)
  158.     if not db[msg.name2] then pimserver.newUser(msg.name2)
  159.         print('new user'..msg.name2)
  160.     end
  161.     db[msg.name].balance=db[msg.name].balance - msg.value
  162.     db[msg.name2].balance=db[msg.name2].balance + msg.value
  163.     return pimserver.broadcast(msg)
  164. end
  165.  
  166. --вычитание с баланса при покупке
  167. function pimserver.buy(msg)
  168.     db[msg.name].balance=db[msg.name].balance - msg.value
  169.     return pimserver.broadcast(msg)
  170. end
  171.  
  172. --различные операции вызываемые по ключу в сообщении
  173. function pimserver.sell(msg)
  174.     db[msg.name].balance=db[msg.name].balance + msg.value
  175.     return pimserver.broadcast(msg)
  176. end
  177. function pimserver.balanceIn(msg)
  178.     db[msg.name].balance=db[msg.name].balance + msg.value
  179.     return pimserver.broadcast(msg)
  180. end
  181. function pimserver.balanceOut(msg)
  182.     db[msg.name].balance=db[msg.name].balance - msg.value
  183.     return pimserver.broadcast(msg)
  184. end
  185. --отправка результата с указанием адреса пославшего
  186. function pimserver.broadcast(msg)
  187.   local sender, balance, number, name, op = msg.sender, db[msg.name].balance, msg.number, msg.name, msg.op
  188.     local post={sender=sender,number=number,name=name,balance=balance,op=op}
  189.     if msg.new then post.new='new' end
  190.     pimserver.post(post)   
  191.  
  192.     --[[if not log[msg.sender] then log[msg.sender]={} end
  193.         log[msg.sender][msg.number]={name=msg.name,op=msg.op,val=msg.value}
  194.     local line='['..serialization.serialize(msg.sender)..']'..'['..serialization.serialize(msg.number)..']'..serialization.serialize(log[msg.sender][msg.mnumber])
  195.     local logs=io.open('logs.pimserver','w','a')
  196.     logs:write(line)
  197.     logs:close()]]--
  198.     return pimserver.saveFile()
  199. end
  200. function pimserver.post(msg)
  201. local post = serialization.serialize(msg)
  202.     return modem.broadcast(send,post)
  203. end
  204.  
  205.  
  206. function pimserver.newUser(name)
  207.     db[name]={}
  208.     db[name].balance='0'
  209.     db[name].ban='-'
  210.     db[name].income='0'
  211.     return pimserver.saveFile()
  212. end
  213.  
  214. function pimserver.WaitToNewOwner()
  215.     if not owners[1] then
  216.         print('Встаньте на ПИМ для регистрации первого владельца')
  217.     else
  218.         print('Встаньте на ПИМ для регистрации следующего владельца')
  219.     end
  220.     player_on = true
  221.     return true
  222. end
  223. function pimserver.regOwner(a)
  224.     table.insert(owners,{UUID=a[3],name=a[2]})
  225.     print('Благодарю. владелец '..#owners..' '..a[2]..'  UUID:'..a[3]..'  зарегестрирован')
  226.     return pimserver.saveOwnersTable()
  227. end
  228.  
  229. --сохранение терминалов в файл
  230. function pimserver.saveTerminalsToFile()
  231.     local dbs=io.open('terminals.pimserver','w')
  232.     for n in pairs(terminal)do
  233.         dbs:write(tostring(terminal[n])..'\n')
  234.     end
  235.     dbs:close()
  236.     return true
  237. end
  238.  
  239. --загрузка терминалов из файла
  240. function pimserver.loadTerminalsFromFile()
  241.     terminal={}
  242.     local dbs=io.open('terminals.pimserver','r')
  243.         local loop = true
  244.         while loop do
  245.             local line=dbs:read('*line')
  246.             if line then
  247.                 table.insert(terminal,line)
  248.             else
  249.                 loop = false
  250.             end
  251.         end
  252.        
  253.         dbs:close()
  254.         return terminal
  255.     end
  256.  
  257. function pimserver.saveFile()
  258.     local dbs=io.open('db.pimserver','w')
  259.     for player in pairs(db)do
  260.         dbs:write(tostring(player)..'\n')
  261.         dbs:write(tostring(db[player].ban..'\n'))
  262.         dbs:write(tostring(db[player].balance..'\n'))
  263.         dbs:write(tostring(db[player].income..'\n'))
  264.     end
  265.     dbs:close()
  266.     return true
  267. end
  268.  
  269. function pimserver.loadFile()
  270.     db={}
  271.     local dbs=io.open('db.pimserver','r')
  272.         local loop = true
  273.         while loop do
  274.             local line=dbs:read('*line')
  275.             if not line then
  276.                 loop = false   
  277.             else
  278.                 local name=tostring(line)
  279.                 db[name]={}
  280.                 db[name].ban=tostring(dbs:read('*line'))
  281.                 db[name].balance=tostring(dbs:read('*line'))
  282.                 db[name].income=tostring(dbs:read('*line'))
  283.             end
  284.         end
  285.         dbs:close()
  286.         return true
  287. end
  288.  
  289. function pimserver.loadOwnersTable()
  290.     local file=io.open('owners.pimserver')
  291.     owners=serialization.unserialize(file:read('*a'))
  292.     return true
  293. end
  294. function pimserver.saveOwnersTable()
  295.     local file=io.open('owners.pimserver','w')
  296.     local data=serialization.serialize(owners)
  297.     file:write(data)
  298.     file:close()
  299.     return true
  300. end
  301.  
  302. function pimserver.init()
  303.     if not fs.exists ('home/db.pimserver') then
  304.         pimserver.newUser('Taoshi')
  305.         pimserver.saveFile()
  306.     end
  307.     pimserver.loadFile()
  308.     if fs.exists('home/terminals.pimserver') then
  309.         pimserver.loadTerminalsFromFile()
  310.     end
  311.     if fs.exists('home/owners.pimserver') then
  312.         pimserver.loadOwnersTable()
  313.     else
  314.         pimserver.WaitToNewOwner()
  315.     end
  316.     pimserver.place()
  317.     --[[if not fs.exists('home/logs.pimserver')then
  318.         local lg=io.open('logs.pimserver','w')
  319.         log.fakesender={}
  320.         log.fakesender[1]={name='Taoshi',op='init',val='1'}
  321.         lg:write(serialization.serialize(log))
  322.         lg:close()
  323.     end]]
  324.     return true
  325. end
  326. --создание овнер-листа посредством пим
  327.  
  328. gpu.setResolution(76,24)
  329. pimserver.init()
  330.  
  331. print('Сервер поднят.')
  332. modem.broadcast(send,'name')
  333. return pimserver
  334.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement