mrWhiskasss

server

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