SHOW:
|
|
- or go back to the newest paste.
1 | --Задается при установке | |
2 | local shell = require("shell") | |
3 | local args = shell.parse(...) | |
4 | local authServerKey = args[1] | |
5 | local url = args[2] | |
6 | local port = tonumber(args[3]) | |
7 | local craftNum = tonumber(args[4]) | |
8 | --добавлять отсутствующие в прайсе, но присутствующие в бд предметы в прайс | |
9 | - | local smart = true |
9 | + | local smart = false |
10 | local serialization = require("serialization") | |
11 | local component = require("component") | |
12 | local event = require("event") | |
13 | local term = require("term") | |
14 | local unicode = require("unicode") | |
15 | local gpu = component.gpu | |
16 | local bg = gpu.getBackground() | |
17 | local fg = gpu.getForeground() | |
18 | --Интциализация переменных | |
19 | local start = true | |
20 | --Здесь храниться инфа о человеке, который залогинился | |
21 | local account = {nick="",balance=0,credit=0} | |
22 | local posScroll = 1 | |
23 | --расстояние авторизации | |
24 | local rd_from = 1.86 | |
25 | local rd_to = 2.77 | |
26 | --размер улучшения базы данных | |
27 | local sizeDatabase = 81 | |
28 | --Проверка и инициализация компонентов | |
29 | local function log(text) | |
30 | gpu.fill(1,49,160,2," ") | |
31 | gpu.set(2,49,text) | |
32 | end | |
33 | function _G.package.loaded.event.shouldInterrupt(...) | |
34 | return false | |
35 | end | |
36 | function _G.package.loaded.event.shouldSoftInterrupt(...) | |
37 | return false | |
38 | end | |
39 | function _G.package.loaded.computer.addUser(...) | |
40 | return false | |
41 | end | |
42 | do | |
43 | if component.getPrimary("internet").address~= nil then print("Check inrternet card is ok") else print("Check inrternet card is absent") start = false end | |
44 | if component.getPrimary("gpu").address~= nil then print("Check gpu card is ok") else print("Check gpu card is absent") start = false end | |
45 | if component.getPrimary("me_interface").address~= nil then print("Check me interface is ok") else print("Check me interface is absent") start = false end | |
46 | if component.getPrimary("radar").address~= nil then print("Check radar is ok") else print("Check radar is absent") start = false end | |
47 | if component.getPrimary("redstone").address~= nil then print("Check redstone is ok") else print("Check redstone is absent") start = false end | |
48 | if component.getPrimary("database").address~= nil then print("Check database is ok") else print("Check database is absent") start = false end | |
49 | end | |
50 | --Работа со скриптом | |
51 | local base = {} | |
52 | if start then | |
53 | local function getFromBD(post) | |
54 | log("Ожидание ответа от базы данных") | |
55 | local result, response | |
56 | local j = 0 | |
57 | local str ="" | |
58 | local i,k | |
59 | while not result or str == "" do | |
60 | if j>10 then os.sleep(60) end | |
61 | j = j + 1 | |
62 | log("Попытка №" .. j .. " соединиться с бд") | |
63 | result, response = pcall(component.internet.connect, url, port) | |
64 | response.write() | |
65 | response.write(post .. '\n') | |
66 | i = 0 | |
67 | k = nil | |
68 | while i<10 and k == nil do | |
69 | i = i + 1 | |
70 | k = response.read(1024) | |
71 | end | |
72 | i = 0 | |
73 | while i<100 and k ~= nil do | |
74 | i = i + 1 | |
75 | str = str .. tostring(k) | |
76 | k = response.read(1024) | |
77 | end | |
78 | end | |
79 | return serialization.unserialize(str) | |
80 | end | |
81 | function base.getAccount(nick) | |
82 | return getFromBD("authkey=".. authServerKey .."&bdquery=getac&nick=" .. nick) | |
83 | end | |
84 | function base.getAccounts() | |
85 | return getFromBD("authkey=".. authServerKey .."&bdquery=getacs") | |
86 | end | |
87 | function base.updAccount(nick,money) | |
88 | return getFromBD("authkey=".. authServerKey .."&bdquery=updac&nick=".. nick .."&money=" .. money) | |
89 | end | |
90 | function base.getPrice(uid) | |
91 | return getFromBD("authkey=".. authServerKey .."&bdquery=getpr&uid=" .. uid) | |
92 | end | |
93 | function base.getPrices() | |
94 | return getFromBD("authkey=".. authServerKey .."&bdquery=getprs") | |
95 | end | |
96 | function base.updPrice(uid,label,buy,sell) | |
97 | return getFromBD("authkey=".. authServerKey .."&bdquery=updpr&uid=".. uid .."&label=".. label .."&buy=".. buy .."&sell=".. sell) | |
98 | end | |
99 | end | |
100 | --Проверяем me_interface, если находит предметы - добавляет в бд | |
101 | if start then | |
102 | log("Проверка мэ интерфейса") | |
103 | for i=1,9,1 do | |
104 | local record = {} | |
105 | slot = component.me_interface.getInterfaceConfiguration(i) | |
106 | if slot~=nil then | |
107 | print("Add new item in list(" .. slot.label .. ", " .. slot.name .. ").\n Enter label: ") | |
108 | record.label = io.read() | |
109 | print("Enter buy: ") | |
110 | record.buy = io.read() | |
111 | print("Enter sell: ") | |
112 | record.sell = io.read() | |
113 | print("Added: " .. tostring(base.updPrice(slot.name .. slot.label, record.label, record.buy, record.sell))) | |
114 | component.me_interface.setInterfaceConfiguration(i) | |
115 | end | |
116 | slot = nil | |
117 | end | |
118 | end | |
119 | --Авторизация игрока на радаре | |
120 | function authPlayer() | |
121 | local pl = component.radar.getPlayers() | |
122 | local pr = 0 | |
123 | local name = "" | |
124 | for i=1,#pl,1 do | |
125 | if pl~=nil and pl[i]~=nil and pl[i].distance < rd_to and pl[i].distance>rd_from then | |
126 | name = pl[i].name | |
127 | pr = pr + 1 | |
128 | end | |
129 | end | |
130 | if pr == 1 then | |
131 | if account.nick~=nil and account.nick == "" then account = base.getAccount(name) end | |
132 | return name,true | |
133 | else | |
134 | posScroll = 1 | |
135 | account = {nick="",balance=0,credit=0} | |
136 | return "",false | |
137 | end | |
138 | end | |
139 | --fix io.read() | |
140 | local ioread=false | |
141 | function ioreadFix( ) | |
142 | if ioread and authPlayer()=="" then | |
143 | event.push("key_down",component.keyboard.address,13,28) | |
144 | ioread=false | |
145 | end | |
146 | end | |
147 | event.timer(10,ioreadFix,math.huge) | |
148 | --Подгрузка price происходит автоматически раз 6 мин | |
149 | local priceList = {} | |
150 | local craftList = {} | |
151 | function loadPrice( ) | |
152 | if authPlayer()=="" or start then | |
153 | log("Загрузка прайслиста") | |
154 | priceList = base.getPrices() | |
155 | local slot = nil | |
156 | for i=1,sizeDatabase,1 do | |
157 | slot = component.database.get(i) | |
158 | if slot~=nil and priceList[slot.name .. slot.label]~=nil then | |
159 | priceList[slot.name .. slot.label].db = i | |
160 | elseif smart then --автодобавление, для отключения smart = false | |
161 | local record = {} | |
162 | if slot~=nil then | |
163 | term.clear() | |
164 | print("Add new item in list(" .. slot.label .. ", " .. slot.name .. ").\n Enter label: ") | |
165 | record.label = io.read() | |
166 | print("Enter buy: ") | |
167 | record.buy = io.read() | |
168 | print("Enter sell: ") | |
169 | record.sell = io.read() | |
170 | base.updPrice(slot.name .. slot.label, record.label, record.buy, record.sell) | |
171 | priceList[slot.name .. slot.label] = {} | |
172 | priceList[slot.name .. slot.label].label = record.label | |
173 | priceList[slot.name .. slot.label].buy = record.buy | |
174 | priceList[slot.name .. slot.label].sell = record.sell | |
175 | priceList[slot.name .. slot.label].db = i | |
176 | end | |
177 | slot = nil | |
178 | end | |
179 | end | |
180 | local me = component.me_interface.getCraftables() | |
181 | local k = {} | |
182 | craftList = {} | |
183 | for i=1,#me do | |
184 | k = me[i].getItemStack() | |
185 | if priceList[k.name .. k.label]~=nil then | |
186 | craftList[#craftList+1] = {} | |
187 | craftList[#craftList].is = k | |
188 | craftList[#craftList].is.size = nil | |
189 | craftList[#craftList].request = me[i].request | |
190 | end | |
191 | end | |
192 | for k,v in pairs(priceList) do | |
193 | if v.db==nil then | |
194 | priceList[k] = nil | |
195 | end | |
196 | end | |
197 | end | |
198 | end | |
199 | loadPrice() | |
200 | --if _G.package.loaded.loadPrice==nil then | |
201 | -- _G.package.loaded.loadPrice=true | |
202 | -- event.timer(360, loadPrice, math.huge) | |
203 | --end | |
204 | --Автокрафт | |
205 | function getSize(name,label) | |
206 | local msize = 0 | |
207 | for k,v in pairs(component.me_interface.getItemsInNetwork({["name"]=name,["label"]=label})) do | |
208 | if tonumber(k)~= nil then | |
209 | if v.size > msize then msize = v.size end | |
210 | end | |
211 | end | |
212 | return msize | |
213 | end | |
214 | local numCraft = 0 | |
215 | local queue = nil | |
216 | function autocraft( ) | |
217 | if authPlayer()=="" then | |
218 | if numCraft ==nil or numCraft==#craftList then numCraft=0 end | |
219 | log("Проверка списка предметов " .. #craftList) | |
220 | if queue~=nil and ( queue.isDone() or queue.isCanceled() ) then log("очередь очищена") queue = nil end | |
221 | if queue==nil then | |
222 | numCraft = numCraft + 1 | |
223 | local pr = getSize(craftList[numCraft].is.name, craftList[numCraft].is.label) | |
224 | if pr~=nil and pr<craftNum then | |
225 | local crnum = craftNum | |
226 | queue = craftList[numCraft].request(crnum) | |
227 | while queue.isCanceled() and crnum>1 do | |
228 | crnum = math.floor(crnum/2) | |
229 | queue = craftList[numCraft].request(crnum) | |
230 | end | |
231 | end | |
232 | end | |
233 | log("поставлен предмет под номером " .. i .. ", " .. craftList[i].is.name .. ", " .. craftList[i].is.label) | |
234 | end | |
235 | end | |
236 | if _G.package.loaded.autocraft==nil then | |
237 | _G.package.loaded.autocraft=true | |
238 | event.timer(10, autocraft, math.huge) | |
239 | end | |
240 | --Фикс монитора | |
241 | function ScreenFix() | |
242 | component.gpu.bind(component.screen.address,true) | |
243 | end | |
244 | event.timer(10,ScreenFix,math.huge) | |
245 | --Окно соглашения | |
246 | function drawBorder(x,y,width,height) | |
247 | width = width - 1 | |
248 | height = height - 1 | |
249 | gpu.fill(x+1 ,y ,width ,1 ,unicode.char(10249)) | |
250 | gpu.fill(x ,y ,1 ,1 ,unicode.char(10319)) | |
251 | gpu.fill(x+1+width ,y ,1 ,1 ,unicode.char(10425)) | |
252 | gpu.fill(x ,y+1 ,1 ,height ,unicode.char(10311)) | |
253 | gpu.fill(x+1+width ,y+1 ,1 ,height ,unicode.char(10424)) | |
254 | gpu.fill(x+1 ,y+1+height ,width ,1 ,unicode.char(10432)) | |
255 | gpu.fill(x ,y+1+height ,1 ,1 ,unicode.char(10439)) | |
256 | gpu.fill(x+1+width ,y+1+height ,1 ,1 ,unicode.char(10488)) | |
257 | end | |
258 | function interfaceIsEmpty() | |
259 | for i = 1,9,1 do | |
260 | if component.me_interface.getInterfaceConfiguration(i) ~= nil then return false end | |
261 | end | |
262 | return true | |
263 | end | |
264 | function redstone(bool) | |
265 | local output = 0 | |
266 | if bool then output = 15 end | |
267 | for i=0,5,1 do component.redstone.setOutput(i,output) end | |
268 | end | |
269 | function acceptable(kPrice,vPrice) | |
270 | log("Формирование заказа") | |
271 | gpu.setBackground(0x301945) | |
272 | term.clear() | |
273 | gpu.setForeground(0xb3bd57) | |
274 | gpu.set(70,2,"Формирование заказа ...") | |
275 | drawBorder(69,1,24,2) | |
276 | gpu.set(5,10,"Ваш заказ: " .. vPrice.label) | |
277 | gpu.set(10,12,"Цена за 1 штуку: " .. vPrice.buy) | |
278 | local maxSize = 0 | |
279 | local inME = component.database.get(vPrice.db) | |
280 | maxSize = inME.maxSize | |
281 | inME = getSize(inME.namem, inME.label) | |
282 | --if inME~=nil then inME = component.me_interface.getItemsInNetwork(inME)[1] end | |
283 | --if inME~=nil then maxSize = inME.maxSize inME = inME.size end | |
284 | --if inME==nil then inME = 0 end | |
285 | gpu.set(10,13,"В МЭ храниться: " .. inME) | |
286 | gpu.set(10,14,"Выбранное количетсво(нажмите, чтобы ввести): 0") | |
287 | gpu.set(20,46,"Купить выбранное") | |
288 | drawBorder(19,44,17,4) | |
289 | gpu.set(120,46,"Отменить") | |
290 | drawBorder(119,44,9,4) | |
291 | local amount = 0 | |
292 | local cancel = false | |
293 | while not cancel do | |
294 | _,_,x,y,_,name = event.pull("touch") | |
295 | if authPlayer() == name then | |
296 | if account.credit~=0 then | |
297 | cancel = true | |
298 | end | |
299 | if not cancel and 119<=x and x<=130 and 44<=y and y<=48 then cancel = true log("отмена") end | |
300 | if not cancel and 55<=x and x<=130 and 13<=y and y<=15 then | |
301 | log("Выбор количетсва") | |
302 | term.setCursor(55,14) | |
303 | ioread=true | |
304 | local _,txt = pcall(io.read) | |
305 | if txt==nil then txt = "" end | |
306 | amount = tonumber(txt) | |
307 | gpu.setBackground(0x301945) | |
308 | gpu.setForeground(0xb3bd57) | |
309 | term.clear() | |
310 | gpu.set(70,2,"Формирование заказа ...") | |
311 | drawBorder(69,1,24,2) | |
312 | gpu.set(5,10,"Ваш заказ: " .. vPrice.label) | |
313 | gpu.set(10,12,"Цена за 1 штуку: " .. vPrice.buy) | |
314 | maxSize = 0 | |
315 | inME = component.database.get(vPrice.db) | |
316 | maxSize = inME.maxSize | |
317 | inME = getSize(inME.namem, inME.label) | |
318 | --if inME~=nil then inME = component.me_interface.getItemsInNetwork(inME)[1] end | |
319 | --if inME~=nil then maxSize = inME.maxSize inME = inME.size end | |
320 | --if inME==nil then inME = 0 end | |
321 | gpu.set(10,13,"В МЭ храниться: " .. inME) | |
322 | gpu.set(10,14,"Выбранное количетсво(нажмите, чтобы ввести): 0") | |
323 | gpu.set(20,46,"Купить выбранное") | |
324 | drawBorder(19,44,17,4) | |
325 | gpu.set(120,46,"Отменить") | |
326 | drawBorder(119,44,9,4) | |
327 | if amount == nil then amount = 0 end | |
328 | if amount<0 then amount = 0 end | |
329 | if account.balance*2 < vPrice.buy*amount then | |
330 | amount = math.floor(account.balance*2 / vPrice.buy) | |
331 | end | |
332 | if amount>inME then amount = inME end | |
333 | if amount>maxSize*9 then amount = maxSize*9 end | |
334 | gpu.fill(55,14,106,1," ") | |
335 | gpu.set(55,14,"" .. amount) | |
336 | end | |
337 | if not cancel and 19<=x and x<=36 and 44<=y and y<=48 then | |
338 | local i = 0 | |
339 | local amt = 0 | |
340 | base.updAccount(account.nick,-vPrice.buy*amount) | |
341 | account = {nick="",balance=0,credit=0} | |
342 | authPlayer() | |
343 | while i<9 and amount>0 do | |
344 | i = i+1 | |
345 | if amount<maxSize then | |
346 | amt = amount | |
347 | amount = 0 | |
348 | else | |
349 | amt = maxSize | |
350 | amount = amount - amt | |
351 | end | |
352 | component.me_interface.setInterfaceConfiguration(i,component.database.address,vPrice.db,amt) | |
353 | end | |
354 | redstone(true) | |
355 | for i=1,9,1 do component.me_interface.setInterfaceConfiguration(i) end | |
356 | os.sleep(1) | |
357 | redstone(false) | |
358 | cancel = true | |
359 | end | |
360 | else cancel = true | |
361 | end | |
362 | end | |
363 | gpu.setBackground(bg) | |
364 | gpu.setForeground(fg) | |
365 | end | |
366 | function drawHeader() | |
367 | if account==nil then account = {} end | |
368 | if account.nick==nil or account.balance==nil or account.credit == nil then account.nick="" account.balance=0 account.credit =0 end | |
369 | gpu.setBackground(0x301945) | |
370 | gpu.setForeground(0xb3bd57) | |
371 | gpu.fill(1,2,160,1," ") | |
372 | drawBorder(0,1,161,2) | |
373 | gpu.set(1,2,"Аккаунт:") | |
374 | gpu.set(9,2,account.nick) | |
375 | gpu.set(30,2,"Баланс:") | |
376 | gpu.set(38,2,account.balance .. "") | |
377 | gpu.set(55,2,"Задолженность:") | |
378 | gpu.set(70,2,account.credit .. "") | |
379 | gpu.set(85,2,"Поиск:") | |
380 | gpu.fill(92,2,69,1,"_") | |
381 | gpu.setBackground(bg) | |
382 | gpu.setForeground(fg) | |
383 | end | |
384 | function drawScroll() | |
385 | gpu.setBackground(0x6a0d73) | |
386 | gpu.setForeground(0xe5df25) | |
387 | gpu.fill(158,4,3,22," ") | |
388 | gpu.fill(159,5,1,1,unicode.char(9650)) | |
389 | gpu.setBackground(0x730d37) | |
390 | gpu.fill(158,26,3,22," ") | |
391 | gpu.fill(159,46,1,1,unicode.char(9660)) | |
392 | gpu.setBackground(bg) | |
393 | gpu.setForeground(fg) | |
394 | end | |
395 | function drawBody() | |
396 | gpu.setBackground(0x301945) | |
397 | gpu.fill(1,8,157,40," ") | |
398 | gpu.setBackground(0x421f63) | |
399 | gpu.setForeground(0xe5df25) | |
400 | gpu.fill(1,4,157,4," ") | |
401 | gpu.fill(1,12,157,4," ") | |
402 | gpu.fill(1,20,157,4," ") | |
403 | gpu.fill(1,28,157,4," ") | |
404 | gpu.fill(1,36,157,4," ") | |
405 | gpu.fill(1,44,157,4," ") | |
406 | gpu.setBackground(bg) | |
407 | gpu.setForeground(fg) | |
408 | end | |
409 | function drawItemList(price) | |
410 | local i = 0 | |
411 | gpu.setForeground(0xe5df25) | |
412 | for k,v in pairs(price) do | |
413 | i = i + 1 | |
414 | if posScroll<=i and i<=posScroll+10 then | |
415 | if ((posScroll+1)%2+i)%2==1 then | |
416 | gpu.setBackground(0x421f63) | |
417 | else | |
418 | gpu.setBackground(0x301945) | |
419 | end | |
420 | gpu.set(3, 4 + 4 * (i - posScroll), "Предмет: " .. v.label) | |
421 | gpu.set(3, 6 + 4 * (i - posScroll), "Цена продажи: " .. v.buy) | |
422 | end | |
423 | ||
424 | end | |
425 | gpu.setBackground(bg) | |
426 | gpu.setForeground(fg) | |
427 | end | |
428 | function starting( ) | |
429 | start = false | |
430 | local fprice = {} | |
431 | local filtered = false | |
432 | local prices = {} | |
433 | while true do | |
434 | log("Стартуем!") | |
435 | filtered = false | |
436 | local p,a = authPlayer() | |
437 | drawHeader() | |
438 | if a then | |
439 | term.clear() | |
440 | drawHeader() | |
441 | drawScroll() | |
442 | drawBody() | |
443 | drawItemList(priceList) | |
444 | while authPlayer()~="" do | |
445 | log("Ожидание дейcтвий пользователя") | |
446 | local _,_,x,y,_,name = event.pull(10,"touch") | |
447 | if x~=nil and y~=nil and name~=nil then | |
448 | if filtered then | |
449 | prices = fprice | |
450 | else | |
451 | prices = priceList | |
452 | end | |
453 | --скрол | |
454 | if 157<=x and x<=160 and 4<=y and y<=25 then posScroll = posScroll - 1 if posScroll <1 then posScroll = 1 end drawBody() drawItemList(prices) end | |
455 | if 157<=x and x<=160 and 26<=y and y<=47 then posScroll = posScroll + 1 if posScroll >78 then posScroll = 1 end drawBody() drawItemList(prices) end | |
456 | --Поиск | |
457 | if 92<=x and x<=160 and 1<=y and y<=3 then | |
458 | drawHeader() | |
459 | posScroll = 1 | |
460 | term.setCursor(92,2) | |
461 | ioread=true | |
462 | local _,filter = pcall(io.read) | |
463 | if filter==nil then filter = "" end | |
464 | if #filter>200 then | |
465 | drawHeader() | |
466 | drawScroll() | |
467 | end | |
468 | fprice = {} | |
469 | local pr = true | |
470 | if filter == "" then pr = false end | |
471 | if pr then | |
472 | pr = false | |
473 | for k,v in pairs(priceList) do | |
474 | if v.label:lower():find(filter:lower())~=nil then | |
475 | pr = true | |
476 | fprice[k] = v | |
477 | end | |
478 | end | |
479 | end | |
480 | if pr then | |
481 | drawBody() | |
482 | posScroll = 1 | |
483 | drawItemList(fprice) | |
484 | filtered = true | |
485 | else | |
486 | drawBody() | |
487 | posScroll = 1 | |
488 | drawItemList(priceList) | |
489 | filtered = false | |
490 | end | |
491 | end | |
492 | --Выбор | |
493 | if 1<=x and x<=156 and 4<=y and y<=47 then | |
494 | local i = 0 | |
495 | for k,v in pairs(prices) do | |
496 | i = i + 1 | |
497 | if i == (posScroll + math.floor((y-4)/4)) then | |
498 | pcall(acceptable,k,v) | |
499 | term.clear() | |
500 | drawHeader() | |
501 | drawScroll() | |
502 | drawBody() | |
503 | posScroll = 1 | |
504 | drawItemList(priceList) | |
505 | filtered = false | |
506 | if account.credit~=0 then | |
507 | log("Погаси задолженность " .. account.nick .. "!") | |
508 | os.sleep(2) | |
509 | end | |
510 | end | |
511 | end | |
512 | end | |
513 | end | |
514 | end | |
515 | else | |
516 | os.sleep(1) | |
517 | end | |
518 | end | |
519 | end | |
520 | while true do pcall(starting) end |