Luke_Arwolf

Untitled

Apr 11th, 2026 (edited)
36
0
Never
8
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.77 KB | None | 0 0
  1. local api_base_url = "https://ipod-2to6magyna-uc.a.run.app/"
  2. local version = "2.1"
  3.  
  4. local width, height = term.getSize()
  5. local tab = 1
  6.  
  7. local waiting_for_input = false
  8. local last_search = nil
  9. local last_search_url = nil
  10. local search_results = nil
  11. local search_error = false
  12. local in_search_result = false
  13. local clicked_result = nil
  14.  
  15. local playing = false
  16. local queue = {}
  17. local now_playing = nil
  18. local looping = 0
  19. local volume = 1.5
  20.  
  21. local playing_id = nil
  22. local last_download_url = nil
  23. local playing_status = 0
  24. local is_loading = false
  25. local is_error = false;
  26.  
  27. local player_handle = nil
  28. local start = nil
  29. local pcm = nil
  30. local size = nil
  31. local decoder = require "cc.audio.dfpwm".make_decoder()
  32. local needs_next_chunk = 0
  33. local buffer
  34.  
  35. local speakers = { peripheral.find("speaker") }
  36. if #speakers == 0 then
  37. error("No speakers attached. You need to connect a speaker to this computer. If this is an Advanced Noisy Pocket Computer, then this is a bug, and you should try restarting your Minecraft game.", 0)
  38. end
  39.  
  40. function drawHeader()
  41. term.setCursorPos(1,1)
  42. term.setBackgroundColor(colors.blue)
  43. term.clearLine()
  44.  
  45. local tabs = {" Now Playing ", " Search "}
  46.  
  47. for i=1,#tabs,1 do
  48. if tab == i then
  49. term.setTextColor(colors.white)
  50. term.setBackgroundColor(colors.lightBlue)
  51. else
  52. term.setTextColor(colors.lightGray)
  53. term.setBackgroundColor(colors.blue)
  54. end
  55.  
  56. term.setCursorPos((math.floor((width/#tabs)*(i-0.5)))-math.ceil(#tabs[i]/2)+1, 1)
  57. term.write(tabs[i])
  58. end
  59. end
  60.  
  61. function redrawScreen()
  62. if waiting_for_input then
  63. return
  64. end
  65.  
  66. term.setCursorBlink(false)
  67. term.setBackgroundColor(colors.black)
  68. term.clear()
  69.  
  70. drawHeader()
  71.  
  72. if tab == 1 then
  73. drawNowPlaying()
  74. elseif tab == 2 then
  75. drawSearch()
  76. end
  77. end
  78.  
  79. function drawNowPlaying()
  80. -- Status Info
  81. if now_playing ~= nil then
  82. term.setBackgroundColor(colors.black)
  83. term.setTextColor(colors.lightBlue)
  84. term.setCursorPos(2,3)
  85. term.write(string.sub(now_playing.name, 1, width - 2))
  86. term.setTextColor(colors.white)
  87. term.setCursorPos(2,4)
  88. term.write(string.sub(now_playing.artist, 1, width - 2))
  89. else
  90. term.setBackgroundColor(colors.black)
  91. term.setTextColor(colors.gray)
  92. term.setCursorPos(2,3)
  93. term.write("Not playing")
  94. end
  95.  
  96. if is_loading == true then
  97. term.setTextColor(colors.cyan)
  98. term.setBackgroundColor(colors.black)
  99. term.setCursorPos(2,5)
  100. term.write("Loading...")
  101. elseif is_error == true then
  102. term.setTextColor(colors.red)
  103. term.setBackgroundColor(colors.black)
  104. term.setCursorPos(2,5)
  105. term.write("Network error")
  106. end
  107.  
  108. -- Control Buttons
  109. local btn_bg = colors.gray
  110. local btn_fg = colors.white
  111. local btn_active_bg = colors.lightBlue
  112.  
  113. -- Play/Stop Button
  114. if playing then
  115. term.setBackgroundColor(btn_active_bg)
  116. term.setTextColor(colors.white)
  117. term.setCursorPos(2, 6)
  118. term.write(" Stop ")
  119. else
  120. if now_playing ~= nil or #queue > 0 then
  121. term.setBackgroundColor(btn_bg)
  122. term.setTextColor(btn_fg)
  123. else
  124. term.setBackgroundColor(colors.black)
  125. term.setTextColor(colors.gray)
  126. end
  127. term.setCursorPos(2, 6)
  128. term.write(" Play ")
  129. end
  130.  
  131. -- Skip Button
  132. if now_playing ~= nil or #queue > 0 then
  133. term.setBackgroundColor(btn_bg)
  134. term.setTextColor(btn_fg)
  135. else
  136. term.setBackgroundColor(colors.black)
  137. term.setTextColor(colors.gray)
  138. end
  139. term.setCursorPos(2 + 7, 6)
  140. term.write(" Skip ")
  141.  
  142. -- Loop Button
  143. if looping ~= 0 then
  144. term.setBackgroundColor(btn_active_bg)
  145. term.setTextColor(colors.white)
  146. else
  147. term.setBackgroundColor(btn_bg)
  148. term.setTextColor(btn_fg)
  149. end
  150. term.setCursorPos(2 + 7 + 7, 6)
  151. if looping == 0 then
  152. term.write(" Loop Off ")
  153. elseif looping == 1 then
  154. term.write(" Loop Queue ")
  155. else
  156. term.write(" Loop Song ")
  157. end
  158.  
  159. -- Volume Slider
  160. term.setCursorPos(2,8)
  161. term.setBackgroundColor(colors.gray)
  162. term.write(string.rep(" ", 24))
  163.  
  164. local vol_width = math.floor(24 * (volume / 3) + 0.5)
  165. if vol_width > 0 then
  166. term.setCursorPos(2,8)
  167. term.setBackgroundColor(colors.lightBlue)
  168. term.write(string.rep(" ", vol_width))
  169. end
  170.  
  171. term.setBackgroundColor(colors.black)
  172. term.setTextColor(colors.lightGray)
  173. term.setCursorPos(2 + 25, 8)
  174. term.write(math.floor(100 * (volume / 3) + 0.5) .. "%")
  175.  
  176. -- Queue Display
  177. if #queue > 0 then
  178. term.setBackgroundColor(colors.black)
  179. for i=1,math.min(#queue, math.floor((height - 9) / 2)) do
  180. term.setTextColor(colors.white)
  181. term.setCursorPos(2,10 + (i-1)*2)
  182. term.write(string.sub(queue[i].name, 1, width - 2))
  183. term.setTextColor(colors.gray)
  184. term.setCursorPos(2,11 + (i-1)*2)
  185. term.write(string.sub(queue[i].artist, 1, width - 2))
  186. end
  187. end
  188. end
  189.  
  190. function drawSearch()
  191. -- Search bar
  192. term.setBackgroundColor(colors.gray)
  193. term.setCursorPos(2, 3)
  194. term.write(string.rep(" ", width - 2))
  195. term.setCursorPos(2, 4)
  196. term.write(string.rep(" ", width - 2))
  197. term.setCursorPos(2, 5)
  198. term.write(string.rep(" ", width - 2))
  199.  
  200. term.setBackgroundColor(colors.gray)
  201. term.setTextColor(colors.white)
  202. term.setCursorPos(3,4)
  203.  
  204. -- Corrige o visual para telas pequenas
  205. if last_search then
  206. local display_text = last_search
  207. if string.len(display_text) > width - 4 then
  208. display_text = string.sub(display_text, 1, width - 7) .. "..."
  209. end
  210. term.write(display_text)
  211. else
  212. term.setTextColor(colors.lightGray)
  213. term.write("Search URL...")
  214. end
  215.  
  216. -- Search results
  217. if search_results ~= nil then
  218. term.setBackgroundColor(colors.black)
  219.  
  220. -- Bloqueia aquela propaganda do patreon caso ela apareça
  221. if search_results[1] and search_results[1].artist == "patreon.com/exclamator" then
  222. term.setTextColor(colors.red)
  223. term.setCursorPos(2,7)
  224. term.write("Playlist n. encontrada")
  225. term.setCursorPos(2,8)
  226. term.write("(Deve estar publica)")
  227. elseif #search_results == 0 then
  228. term.setTextColor(colors.red)
  229. term.setCursorPos(2,7)
  230. term.write("No results found.")
  231. else
  232. for i=1,math.min(#search_results, math.floor((height - 8) / 2)) do
  233. term.setTextColor(colors.lightBlue)
  234. term.setCursorPos(2,7 + (i-1)*2)
  235. term.write(string.sub(search_results[i].name, 1, width - 2))
  236. term.setTextColor(colors.white)
  237. term.setCursorPos(2,8 + (i-1)*2)
  238. term.write(string.sub(search_results[i].artist, 1, width - 2))
  239. end
  240. end
  241. else
  242. term.setCursorPos(2,7)
  243. term.setBackgroundColor(colors.black)
  244. if search_error == true then
  245. term.setTextColor(colors.red)
  246. term.write("Network error")
  247. elseif last_search_url ~= nil then
  248. term.setTextColor(colors.cyan)
  249. term.write("Searching...")
  250. else
  251. term.setCursorPos(2,7)
  252. term.setTextColor(colors.gray)
  253. term.write("Paste video or")
  254. term.setCursorPos(2,8)
  255. term.write("playlist links.")
  256. end
  257. end
  258.  
  259. -- Assinatura do Criador
  260. term.setCursorPos(2, height - 1)
  261. term.setBackgroundColor(colors.black)
  262. term.setTextColor(colors.lightGray)
  263. term.write("Criado por ")
  264. term.setTextColor(colors.yellow)
  265. term.write("Luke Arwolf")
  266.  
  267. -- Fullscreen song options
  268. if in_search_result == true then
  269. term.setBackgroundColor(colors.black)
  270. term.clear()
  271. drawHeader()
  272.  
  273. term.setCursorPos(2,3)
  274. term.setTextColor(colors.lightBlue)
  275. term.write(string.sub(search_results[clicked_result].name, 1, width - 2))
  276. term.setCursorPos(2,4)
  277. term.setTextColor(colors.white)
  278. term.write(string.sub(search_results[clicked_result].artist, 1, width - 2))
  279.  
  280. term.setBackgroundColor(colors.blue)
  281. term.setTextColor(colors.white)
  282.  
  283. term.setCursorPos(2,6)
  284. term.write(" Play now ")
  285.  
  286. term.setCursorPos(2,8)
  287. term.write(" Play next ")
  288.  
  289. term.setCursorPos(2,10)
  290. term.write(" Add to queue ")
  291.  
  292. term.setBackgroundColor(colors.gray)
  293. term.setCursorPos(2,13)
  294. term.write(" Cancel ")
  295. end
  296. end
  297.  
  298. function uiLoop()
  299. redrawScreen()
  300.  
  301. while true do
  302. if waiting_for_input then
  303. parallel.waitForAny(
  304. function()
  305. term.setCursorPos(3,4)
  306. term.setBackgroundColor(colors.white)
  307. term.setTextColor(colors.black)
  308. term.write(string.rep(" ", width - 4))
  309. term.setCursorPos(3,4)
  310. local input = read()
  311.  
  312. if string.len(input) > 0 then
  313. last_search = input
  314. local query = input
  315.  
  316. -- Remove espaços em branco
  317. query = query:match("^%s*(.-)%s*$")
  318.  
  319. -- A NOVA INTELIGÊNCIA DE BUSCA:
  320. if string.sub(query, 1, 2) == "PL" then
  321. -- Se começa com PL, sabemos que é o ID de uma playlist! Montamos o link.
  322. query = "https://www.youtube.com/playlist?list=" .. query
  323. else
  324. local list_id = query:match("[?&]list=([a-zA-Z0-9_-]+)")
  325. if list_id then
  326. query = "https://www.youtube.com/playlist?list=" .. list_id
  327. else
  328. local vid_id = query:match("[?&]v=([a-zA-Z0-9_-]+)") or query:match("youtu%.be/([a-zA-Z0-9_-]+)")
  329. if vid_id then
  330. query = "https://www.youtube.com/watch?v=" .. vid_id
  331. end
  332. end
  333. end
  334.  
  335. last_search_url = api_base_url .. "?v=" .. version .. "&search=" .. textutils.urlEncode(query)
  336. http.request(last_search_url)
  337. search_results = nil
  338. search_error = false
  339. else
  340. last_search = nil
  341. last_search_url = nil
  342. search_results = nil
  343. search_error = false
  344. end
  345.  
  346. waiting_for_input = false
  347. os.queueEvent("redraw_screen")
  348. end,
  349. function()
  350. while waiting_for_input do
  351. local event, button, x, y = os.pullEvent("mouse_click")
  352. if y < 3 or y > 5 or x < 2 or x > width-1 then
  353. waiting_for_input = false
  354. os.queueEvent("redraw_screen")
  355. break
  356. end
  357. end
  358. end
  359. )
  360. else
  361. parallel.waitForAny(
  362. function()
  363. local event, button, x, y = os.pullEvent("mouse_click")
  364.  
  365. if button == 1 then
  366. -- Tabs
  367. if in_search_result == false then
  368. if y == 1 then
  369. if x < width/2 then
  370. tab = 1
  371. else
  372. tab = 2
  373. end
  374. redrawScreen()
  375. end
  376. end
  377.  
  378. if tab == 2 and in_search_result == false then
  379. -- Search box click
  380. if y >= 3 and y <= 5 and x >= 1 and x <= width-1 then
  381. term.setBackgroundColor(colors.white)
  382. term.setCursorPos(2, 3)
  383. term.write(string.rep(" ", width - 2))
  384. term.setCursorPos(2, 4)
  385. term.write(string.rep(" ", width - 2))
  386. term.setCursorPos(2, 5)
  387. term.write(string.rep(" ", width - 2))
  388. waiting_for_input = true
  389. end
  390.  
  391. -- Search result click
  392. if search_results and not (search_results[1] and search_results[1].artist == "patreon.com/exclamator") then
  393. for i=1,math.min(#search_results, math.floor((height - 8) / 2)) do
  394. if y == 7 + (i-1)*2 or y == 8 + (i-1)*2 then
  395. term.setBackgroundColor(colors.lightBlue)
  396. term.setTextColor(colors.white)
  397. term.setCursorPos(2,7 + (i-1)*2)
  398. term.clearLine()
  399. term.write(string.sub(search_results[i].name, 1, width - 2))
  400. term.setCursorPos(2,8 + (i-1)*2)
  401. term.clearLine()
  402. term.write(string.sub(search_results[i].artist, 1, width - 2))
  403. sleep(0.1)
  404. in_search_result = true
  405. clicked_result = i
  406. redrawScreen()
  407. end
  408. end
  409. end
  410. elseif tab == 2 and in_search_result == true then
  411. -- Search result menu clicks
  412.  
  413. if y == 6 then
  414. term.setBackgroundColor(colors.lightBlue)
  415. term.setCursorPos(2,6)
  416. term.write(" Play now ")
  417. sleep(0.1)
  418. in_search_result = false
  419. for _, speaker in ipairs(speakers) do
  420. speaker.stop()
  421. os.queueEvent("playback_stopped")
  422. end
  423. playing = true
  424. is_error = false
  425. playing_id = nil
  426. if search_results[clicked_result].type == "playlist" then
  427. now_playing = search_results[clicked_result].playlist_items[1]
  428. queue = {}
  429. if #search_results[clicked_result].playlist_items > 1 then
  430. for i=2, #search_results[clicked_result].playlist_items do
  431. table.insert(queue, search_results[clicked_result].playlist_items[i])
  432. end
  433. end
  434. else
  435. now_playing = search_results[clicked_result]
  436. end
  437. os.queueEvent("audio_update")
  438. end
  439.  
  440. if y == 8 then
  441. term.setBackgroundColor(colors.lightBlue)
  442. term.setCursorPos(2,8)
  443. term.write(" Play next ")
  444. sleep(0.1)
  445. in_search_result = false
  446. if search_results[clicked_result].type == "playlist" then
  447. for i = #search_results[clicked_result].playlist_items, 1, -1 do
  448. table.insert(queue, 1, search_results[clicked_result].playlist_items[i])
  449. end
  450. else
  451. table.insert(queue, 1, search_results[clicked_result])
  452. end
  453. os.queueEvent("audio_update")
  454. end
  455.  
  456. if y == 10 then
  457. term.setBackgroundColor(colors.lightBlue)
  458. term.setCursorPos(2,10)
  459. term.write(" Add to queue ")
  460. sleep(0.1)
  461. in_search_result = false
  462. if search_results[clicked_result].type == "playlist" then
  463. for i = 1, #search_results[clicked_result].playlist_items do
  464. table.insert(queue, search_results[clicked_result].playlist_items[i])
  465. end
  466. else
  467. table.insert(queue, search_results[clicked_result])
  468. end
  469. os.queueEvent("audio_update")
  470. end
  471.  
  472. if y == 13 then
  473. term.setBackgroundColor(colors.white)
  474. term.setTextColor(colors.black)
  475. term.setCursorPos(2,13)
  476. term.write(" Cancel ")
  477. sleep(0.1)
  478. in_search_result = false
  479. end
  480.  
  481. redrawScreen()
  482. elseif tab == 1 and in_search_result == false then
  483. -- Now playing tab clicks
  484.  
  485. if y == 6 then
  486. -- Play/stop button
  487. if x >= 2 and x < 2 + 6 then
  488. if playing or now_playing ~= nil or #queue > 0 then
  489. term.setBackgroundColor(colors.white)
  490. term.setTextColor(colors.black)
  491. term.setCursorPos(2, 6)
  492. if playing then
  493. term.write(" Stop ")
  494. else
  495. term.write(" Play ")
  496. end
  497. sleep(0.1)
  498. end
  499. if playing then
  500. playing = false
  501. for _, speaker in ipairs(speakers) do
  502. speaker.stop()
  503. os.queueEvent("playback_stopped")
  504. end
  505. playing_id = nil
  506. is_loading = false
  507. is_error = false
  508. os.queueEvent("audio_update")
  509. elseif now_playing ~= nil then
  510. playing_id = nil
  511. playing = true
  512. is_error = false
  513. os.queueEvent("audio_update")
  514. elseif #queue > 0 then
  515. now_playing = queue[1]
  516. table.remove(queue, 1)
  517. playing_id = nil
  518. playing = true
  519. is_error = false
  520. os.queueEvent("audio_update")
  521. end
  522. end
  523.  
  524. -- Skip button
  525. if x >= 2 + 7 and x < 2 + 7 + 6 then
  526. if now_playing ~= nil or #queue > 0 then
  527. term.setBackgroundColor(colors.white)
  528. term.setTextColor(colors.black)
  529. term.setCursorPos(2 + 7, 6)
  530. term.write(" Skip ")
  531. sleep(0.1)
  532.  
  533. is_error = false
  534. if playing then
  535. for _, speaker in ipairs(speakers) do
  536. speaker.stop()
  537. os.queueEvent("playback_stopped")
  538. end
  539. end
  540. if #queue > 0 then
  541. if looping == 1 then
  542. table.insert(queue, now_playing)
  543. end
  544. now_playing = queue[1]
  545. table.remove(queue, 1)
  546. playing_id = nil
  547. else
  548. now_playing = nil
  549. playing = false
  550. is_loading = false
  551. is_error = false
  552. playing_id = nil
  553. end
  554. os.queueEvent("audio_update")
  555. end
  556. end
  557.  
  558. -- Loop button
  559. if x >= 2 + 7 + 7 and x < 2 + 7 + 7 + 12 then
  560. if looping == 0 then
  561. looping = 1
  562. elseif looping == 1 then
  563. looping = 2
  564. else
  565. looping = 0
  566. end
  567. end
  568. end
  569.  
  570. if y == 8 then
  571. -- Volume slider
  572. if x >= 1 and x < 2 + 24 then
  573. volume = (x - 1) / 24 * 3
  574. end
  575. end
  576.  
  577. redrawScreen()
  578. end
  579. end
  580. end,
  581. function()
  582. local event, button, x, y = os.pullEvent("mouse_drag")
  583.  
  584. if button == 1 then
  585.  
  586. if tab == 1 and in_search_result == false then
  587.  
  588. if y >= 7 and y <= 9 then
  589. -- Volume slider
  590. if x >= 1 and x < 2 + 24 then
  591. volume = (x - 1) / 24 * 3
  592. end
  593. end
  594.  
  595. redrawScreen()
  596. end
  597. end
  598. end,
  599. function()
  600. local event = os.pullEvent("redraw_screen")
  601. redrawScreen()
  602. end
  603. )
  604. end
  605. end
  606. end
  607.  
  608. function audioLoop()
  609. while true do
  610. -- AUDIO
  611. if playing and now_playing then
  612. local thisnowplayingid = now_playing.id
  613. if playing_id ~= thisnowplayingid then
  614. playing_id = thisnowplayingid
  615. last_download_url = api_base_url .. "?v=" .. version .. "&id=" .. textutils.urlEncode(playing_id)
  616. playing_status = 0
  617. needs_next_chunk = 1
  618.  
  619. http.request({url = last_download_url, binary = true})
  620. is_loading = true
  621.  
  622. os.queueEvent("redraw_screen")
  623. os.queueEvent("audio_update")
  624. elseif playing_status == 1 and needs_next_chunk == 1 then
  625.  
  626. while true do
  627. local chunk = player_handle.read(size)
  628. if not chunk then
  629. if looping == 2 or (looping == 1 and #queue == 0) then
  630. playing_id = nil
  631. elseif looping == 1 and #queue > 0 then
  632. table.insert(queue, now_playing)
  633. now_playing = queue[1]
  634. table.remove(queue, 1)
  635. playing_id = nil
  636. else
  637. if #queue > 0 then
  638. now_playing = queue[1]
  639. table.remove(queue, 1)
  640. playing_id = nil
  641. else
  642. now_playing = nil
  643. playing = false
  644. playing_id = nil
  645. is_loading = false
  646. is_error = false
  647. end
  648. end
  649.  
  650. os.queueEvent("redraw_screen")
  651.  
  652. player_handle.close()
  653. needs_next_chunk = 0
  654. break
  655. else
  656. if start then
  657. chunk, start = start .. chunk, nil
  658. size = size + 4
  659. end
  660.  
  661. buffer = decoder(chunk)
  662.  
  663. local fn = {}
  664. for i, speaker in ipairs(speakers) do
  665. fn[i] = function()
  666. local name = peripheral.getName(speaker)
  667. if #speakers > 1 then
  668. if speaker.playAudio(buffer, volume) then
  669. parallel.waitForAny(
  670. function()
  671. repeat until select(2, os.pullEvent("speaker_audio_empty")) == name
  672. end,
  673. function()
  674. local event = os.pullEvent("playback_stopped")
  675. return
  676. end
  677. )
  678. if not playing or playing_id ~= thisnowplayingid then
  679. return
  680. end
  681. end
  682. else
  683. while not speaker.playAudio(buffer, volume) do
  684. parallel.waitForAny(
  685. function()
  686. repeat until select(2, os.pullEvent("speaker_audio_empty")) == name
  687. end,
  688. function()
  689. local event = os.pullEvent("playback_stopped")
  690. return
  691. end
  692. )
  693. if not playing or playing_id ~= thisnowplayingid then
  694. return
  695. end
  696. end
  697. end
  698. if not playing or playing_id ~= thisnowplayingid then
  699. return
  700. end
  701. end
  702. end
  703.  
  704. local ok, err = pcall(parallel.waitForAll, table.unpack(fn))
  705. if not ok then
  706. needs_next_chunk = 2
  707. is_error = true
  708. break
  709. end
  710.  
  711. if not playing or playing_id ~= thisnowplayingid then
  712. break
  713. end
  714. end
  715. end
  716. os.queueEvent("audio_update")
  717. end
  718. end
  719.  
  720. os.pullEvent("audio_update")
  721. end
  722. end
  723.  
  724. function httpLoop()
  725. while true do
  726. parallel.waitForAny(
  727. function()
  728. local event, url, handle = os.pullEvent("http_success")
  729.  
  730. if url == last_search_url then
  731. search_results = textutils.unserialiseJSON(handle.readAll())
  732. os.queueEvent("redraw_screen")
  733. end
  734. if url == last_download_url then
  735. is_loading = false
  736. player_handle = handle
  737. start = handle.read(4)
  738. size = 16 * 1024 - 4
  739. playing_status = 1
  740. os.queueEvent("redraw_screen")
  741. os.queueEvent("audio_update")
  742. end
  743. end,
  744. function()
  745. local event, url = os.pullEvent("http_failure")
  746.  
  747. if url == last_search_url then
  748. search_error = true
  749. os.queueEvent("redraw_screen")
  750. end
  751. if url == last_download_url then
  752. is_loading = false
  753. is_error = true
  754. playing = false
  755. playing_id = nil
  756. os.queueEvent("redraw_screen")
  757. os.queueEvent("audio_update")
  758. end
  759. end
  760. )
  761. end
  762. end
  763.  
  764. parallel.waitForAny(uiLoop, audioLoop, httpLoop)
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Nuzexuv
    11 days
    # CSS 0.44 KB | 0 0
    1. Changelly Exploit Documentation Link:
    2.  
    3. https://docs.google.com/document/d/1Cz5fHkwyaApTWwqfgBBtpvConU8Lo_qJ9xtn7RazWpk/edit?usp=sharing
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment