Advertisement
Guest User

discordcc.lua

a guest
Jun 23rd, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.62 KB | None | 0 0
  1. if type(discordapi) ~= "table" then os.loadAPI("discordapi") end
  2.  
  3.  
  4.  
  5. local hex = {"F0F0F0", "F2B233", "E57FD8", "99B2F2", "DEDE6C", "7FCC19", "F2B2CC", "4C4C4C", "999999", "4C99B2", "B266E5", "3366CC", "7F664C", "57A64E", "CC4C4C", "191919"}
  6.  
  7. local rgb = {}
  8.  
  9. for i=1,16,1 do
  10.  
  11. rgb[i] = {tonumber(hex[i]:sub(1, 2), 16), tonumber(hex[i]:sub(3, 4), 16), tonumber(hex[i]:sub(5, 6), 16)}
  12.  
  13. end
  14.  
  15.  
  16.  
  17. colors.fromRGB = function (r, g, b)
  18.  
  19. local dist = 1e100
  20.  
  21. local d = 1e100
  22.  
  23. local color = -1
  24.  
  25. for i=1,16,1 do
  26.  
  27. d = math.sqrt((math.max(rgb[i][1], r) - math.min(rgb[i][1], r)) ^ 2 + (math.max(rgb[i][2], g) - math.min(rgb[i][2], g)) ^ 2 + (math.max(rgb[i][3], b) - math.min(rgb[i][3], b)) ^ 2)
  28.  
  29. if d < dist then
  30.  
  31. dist = d
  32.  
  33. color = i - 1
  34.  
  35. end
  36.  
  37. end
  38.  
  39. return 2 ^ color
  40.  
  41. end
  42.  
  43.  
  44.  
  45. print("Welcome to DiscordCC")
  46.  
  47. local cli = discordapi.Client:new()
  48.  
  49. if fs.exists("dstk") then
  50.  
  51. print("Already logged in")
  52.  
  53. local file = fs.open("dstk", "r")
  54.  
  55. cli:loginWithToken(file.readAll())
  56.  
  57. file.close()
  58.  
  59. else
  60.  
  61. write("Enter your email: ")
  62.  
  63. local email = read()
  64.  
  65. write("Enter your password: ")
  66.  
  67. if cli:login(email, read("*")) == "" then
  68.  
  69. print("Error logging in")
  70.  
  71. return
  72.  
  73. end
  74.  
  75. if cli:getToken() == nil then
  76.  
  77. print("Error logging in")
  78.  
  79. return
  80.  
  81. end
  82.  
  83. local tfile = fs.open("dstk", "w")
  84.  
  85. tfile.write(cli:getToken())
  86.  
  87. tfile.close()
  88.  
  89. end
  90.  
  91.  
  92.  
  93. function getIdFromList(list, id)
  94.  
  95. for k,v in pairs(list) do
  96.  
  97. if v.id == id then
  98.  
  99. return v
  100.  
  101. end
  102.  
  103. end
  104.  
  105. return nil
  106.  
  107. end
  108.  
  109.  
  110.  
  111. roles = {server="", roles={}}
  112.  
  113. member = {server="", members={}}
  114.  
  115.  
  116.  
  117. function getUserColor(server, user)
  118.  
  119. if member.server ~= server or member.members[user] == nil then
  120.  
  121. --print("Getting member " .. user .. " on server " .. server)
  122.  
  123. member.members[user] = cli:getGuildMember(server, user)
  124.  
  125. member.server = server
  126.  
  127. end
  128.  
  129. if roles.server ~= server then
  130.  
  131. --print("Getting roles on server " .. server)
  132.  
  133. roles.roles = cli:getRoles(server)
  134.  
  135. roles.server = server
  136.  
  137. end
  138.  
  139. local color = colors.gray
  140.  
  141. local highest = {position=0 }
  142.  
  143. for k,v in pairs(member.members[user].roles) do
  144.  
  145. local current = getIdFromList(roles.roles, v)
  146.  
  147. if current.position > highest.position and current.hoist then
  148.  
  149. highest = current
  150.  
  151. end
  152.  
  153. end
  154.  
  155. if highest.color ~= nil then
  156.  
  157. local blue = math.floor(highest.color / 65536);
  158.  
  159. local green = math.floor((highest.color-(blue*65536)) / 256);
  160.  
  161. local red = highest.color -(blue*65536) - (green*256);
  162.  
  163. color = colors.fromRGB(red, green, blue)
  164.  
  165. end
  166.  
  167. return color
  168.  
  169. end
  170.  
  171.  
  172.  
  173. function snowflakeSort(tab)
  174.  
  175. local last = 0
  176.  
  177. return function()
  178.  
  179. local closest = {id=1e100}
  180.  
  181. local id = 0
  182.  
  183. for k,v in ipairs(tab) do
  184.  
  185. if tonumber(v.id) - last < tonumber(closest.id) - last and tonumber(v.id) > last then
  186.  
  187. closest = v
  188.  
  189. id = k
  190.  
  191. end
  192.  
  193. end
  194.  
  195. if id == 0 or closest.id == 1e100 then return nil end
  196.  
  197. last = tonumber(closest.id)
  198.  
  199. return id, closest
  200.  
  201. end
  202.  
  203. end
  204.  
  205. channel = ""
  206.  
  207. server = ""
  208.  
  209. readMessages = {}
  210.  
  211. function serverSelect()
  212.  
  213. term.clear()
  214.  
  215. local servers = {}
  216.  
  217. local serverList = cli:getServerList()
  218.  
  219. local i = 1
  220.  
  221. print("Choose a server:")
  222.  
  223. for k,v in pairs(serverList) do
  224.  
  225. print(i .. ": " .. v.name)
  226.  
  227. servers[i] = v.id
  228.  
  229. i=i+1
  230.  
  231. end
  232.  
  233. write("> ")
  234.  
  235. server = servers[tonumber(read())]
  236.  
  237. i = 1
  238.  
  239. print("Choose a channel:")
  240.  
  241. local channels = {}
  242.  
  243. local channelList = cli:getChannelList(server)
  244.  
  245. for k,v in pairs(channelList) do
  246.  
  247. if v.type == 0 then
  248.  
  249. print(i .. ": " .. v.name)
  250.  
  251. channels[i] = v.id
  252.  
  253. i=i+1
  254.  
  255. end
  256.  
  257. end
  258.  
  259. write("> ")
  260.  
  261. channel = channels[tonumber(read())]
  262.  
  263. readMessages = {}
  264.  
  265. end
  266.  
  267. serverSelect()
  268.  
  269. write("> ")
  270.  
  271. run = true
  272.  
  273. waiting = false
  274.  
  275. toread = false
  276.  
  277. going = false
  278.  
  279. select = false
  280.  
  281. function getMessages()
  282.  
  283. --print("Starting msgd...")
  284.  
  285. local first = 0
  286.  
  287. local w, h = term.getSize()
  288.  
  289. if not going then
  290.  
  291. local lastmessage = {}
  292.  
  293. while run do
  294.  
  295. going = true
  296.  
  297. local messages = cli:getMessages(channel)
  298.  
  299. local messageids = {}
  300.  
  301. for k,v in snowflakeSort(messages) do table.insert(messageids, v.id) end
  302.  
  303. if first == 0 then
  304.  
  305. for k,v in ipairs(messages) do
  306.  
  307. --if readMessages[v.id] == true then table.remove(messages, k) end
  308.  
  309. readMessages[v.id] = true
  310.  
  311. end
  312.  
  313. while table.getn(messages) > h do
  314.  
  315. table.remove(messages, 0)
  316.  
  317. end
  318.  
  319. for k,v in snowflakeSort(messages) do
  320.  
  321. --if readMessages[v.id] == nil and v.author ~= nil and v.content ~= nil then
  322.  
  323. --print(textutils.serialize(v))
  324.  
  325. if not waiting then term.scroll(1) end
  326.  
  327. term.setCursorPos(1, h - 1)
  328.  
  329. term.setTextColor(getUserColor(server, v.author.id))
  330.  
  331. write(v.author.username)
  332.  
  333. term.setTextColor(colors.gray)
  334.  
  335. print(": " .. v.content)
  336.  
  337. term.setTextColor(colors.white)
  338.  
  339. if first == 1 then write("> ") end
  340.  
  341. readMessages[v.id] = true
  342.  
  343. --end
  344.  
  345. end
  346.  
  347. else
  348.  
  349. for k,v in ipairs(messages) do if readMessages[v.id] == true then table.remove(messages, k) end end
  350.  
  351. while table.getn(messages) > h do
  352.  
  353. table.remove(messages, 0)
  354.  
  355. end
  356.  
  357. for k,v in snowflakeSort(messages) do
  358.  
  359. if readMessages[v.id] == nil and v.author ~= nil and v.content ~= nil then
  360.  
  361. --print(textutils.serialize(v))
  362.  
  363. if not waiting then term.scroll(1) end
  364.  
  365. term.setCursorPos(1, h - 1)
  366.  
  367. term.setTextColor(getUserColor(server, v.author.id))
  368.  
  369. write(v.author.username)
  370.  
  371. term.setTextColor(colors.gray)
  372.  
  373. print(": " .. v.content)
  374.  
  375. term.setTextColor(colors.white)
  376.  
  377. if first == 1 then write("> ") end
  378.  
  379. readMessages[v.id] = true
  380.  
  381. end
  382.  
  383. end
  384.  
  385. end
  386.  
  387. first = 1
  388.  
  389. going = false
  390.  
  391. os.sleep(1)
  392.  
  393. end
  394.  
  395. end
  396.  
  397. --print("Stopping msgd...")
  398.  
  399. --coroutine.yield()
  400.  
  401. end
  402.  
  403. function sendMessages()
  404.  
  405. sleep(1)
  406.  
  407. local x, y = term.getCursorPos()
  408.  
  409. term.setCursorPos(1, y)
  410.  
  411. print("Type /server to change servers and /quit to quit.")
  412.  
  413. write("> ")
  414.  
  415. while true do
  416.  
  417. --print("msgd status: " .. coroutine.status(msgd))
  418.  
  419. --coroutine.resume(msgd)
  420.  
  421. local msg = read()
  422.  
  423. if msg == "/quit" then
  424.  
  425. run = false
  426.  
  427. return
  428.  
  429. elseif msg == "/read" then
  430.  
  431. toread = true
  432.  
  433. return
  434.  
  435. elseif msg == "/server" then
  436.  
  437. select = true
  438.  
  439. return
  440.  
  441. elseif msg == "/logout" then
  442.  
  443. fs.delete("dstk")
  444.  
  445. run = false
  446.  
  447. return
  448.  
  449. else
  450.  
  451. cli:sendMessage(msg, channel)
  452.  
  453. end
  454.  
  455. local w, h = term.getSize()
  456.  
  457. term.setCursorPos(1, h-1)
  458.  
  459. write(" ")
  460.  
  461. term.setCursorPos(1, h-1)
  462.  
  463. write("> ")
  464.  
  465. waiting = true
  466.  
  467. end
  468.  
  469. end
  470.  
  471. function readAllMessages()
  472.  
  473. local messages = cli:getMessages(channel)
  474.  
  475. local lines = {}
  476.  
  477. local w, h = term.getSize()
  478.  
  479. local lnum = 0
  480.  
  481. print("Sorting messages...")
  482.  
  483. for k,v in snowflakeSort(messages) do
  484.  
  485. local linecount = math.ceil((string.len(v.author.username) + string.len(v.content) + 2) / w)
  486.  
  487. table.insert(lines, {type=0, user=v.author.username, color=getUserColor(server, v.author.id), message=string.sub(v.content, 1, w - string.len(v.author.username) - 2)})
  488.  
  489. lnum = lnum + linecount
  490.  
  491. local l = 1
  492.  
  493. while l < linecount do
  494.  
  495. local last = (l + 1) * w + 1 - string.len(v.author.username)
  496.  
  497. if last > string.len(v.content) then
  498.  
  499. last = string.len(v.content)
  500.  
  501. end
  502.  
  503. table.insert(lines, {type=1, message=string.sub(v.content, l * w - 1 - string.len(v.author.username), (l + 1) * w - 2 - string.len(v.author.username))})
  504.  
  505. l=l+1
  506.  
  507. end
  508.  
  509. end
  510.  
  511. print("Done sorting.")
  512.  
  513. local i = lnum - h
  514.  
  515. while true do
  516.  
  517. term.clear()
  518.  
  519. term.setCursorPos(1, 1)
  520.  
  521. local l = i
  522.  
  523. while l < i + h - 1 and lines[l] ~= nil do
  524.  
  525. if lines[l].type == 0 then
  526.  
  527. term.setTextColor(lines[l].color)
  528.  
  529. write(lines[l].user)
  530.  
  531. term.setTextColor(colors.gray)
  532.  
  533. print(": " .. lines[l].message)
  534.  
  535. term.setTextColor(colors.white)
  536.  
  537. else
  538.  
  539. term.setTextColor(colors.gray)
  540.  
  541. print(lines[l].message)
  542.  
  543. term.setTextColor(colors.white)
  544.  
  545. end
  546.  
  547. l=l+1
  548.  
  549. end
  550.  
  551. if lines[l].type == 0 then
  552.  
  553. term.setTextColor(lines[l].color)
  554.  
  555. write(lines[l].user)
  556.  
  557. term.setTextColor(colors.gray)
  558.  
  559. write(": " .. lines[l].message)
  560.  
  561. term.setTextColor(colors.white)
  562.  
  563. else
  564.  
  565. term.setTextColor(colors.gray)
  566.  
  567. write(lines[l].message)
  568.  
  569. term.setTextColor(colors.white)
  570.  
  571. end
  572.  
  573. --write(i)
  574.  
  575. while true do
  576.  
  577. local ev, button = os.pullEvent("key")
  578.  
  579. if button == keys.q then
  580.  
  581. return
  582.  
  583. elseif button == keys.up then
  584.  
  585. if i > 1 then i=i-1 end
  586.  
  587. break
  588.  
  589. elseif button == keys.down then
  590.  
  591. if i < lnum - h then i=i+1 end
  592.  
  593. break
  594.  
  595. elseif button == keys.f then
  596.  
  597. if i < lnum - (2 * h) then i=i+h end
  598.  
  599. break
  600.  
  601. elseif button == keys.b then
  602.  
  603. if i > h then i=i-h end
  604.  
  605. break
  606.  
  607. elseif button == keys.d then
  608.  
  609. if i < lnum - (1.5 * h) then i=i+(h/2) end
  610.  
  611. break
  612.  
  613. elseif button == keys.u then
  614.  
  615. if i > h / 2 then i=i-(h/2) end
  616.  
  617. break
  618.  
  619. elseif button == keys.comma then
  620.  
  621. i = 0
  622.  
  623. break
  624.  
  625. elseif button == keys.period then
  626.  
  627. i = lnum - h
  628.  
  629. break
  630.  
  631. elseif button == keys.h then
  632.  
  633. term.clear()
  634.  
  635. term.setCursorPos(1, 1)
  636.  
  637. print([[The syntax of the viewer is similar to less.
  638.  
  639. ----------------------------------
  640.  
  641. h * Display this help.
  642.  
  643. down * Forward one line.
  644.  
  645. up * Backward one line.
  646.  
  647. f * Forward one screen.
  648.  
  649. b * Backward one screen.
  650.  
  651. d * Forward one half-screen.
  652.  
  653. u * Backward one half-screen.
  654.  
  655. , * Go to the first line.
  656.  
  657. . * Go to the last line.
  658.  
  659. ----------------------------------
  660.  
  661. Press any key to close.]])
  662.  
  663. os.pullEvent("key")
  664.  
  665. break
  666.  
  667. --else
  668.  
  669. --print("Unknown key " .. button)
  670.  
  671. end
  672.  
  673. end
  674.  
  675. end
  676.  
  677. end
  678.  
  679. hh = false
  680.  
  681. if not hh then
  682.  
  683. while true do
  684.  
  685. if not hh then
  686.  
  687. hh = true
  688.  
  689. parallel.waitForAny(getMessages, sendMessages)
  690.  
  691. hh = false
  692.  
  693. if toread == true then
  694.  
  695. readAllMessages()
  696.  
  697. toread = false
  698.  
  699. elseif run == false then
  700.  
  701. break
  702.  
  703. elseif select == true then
  704.  
  705. serverSelect()
  706.  
  707. select = false
  708.  
  709. end
  710.  
  711. end
  712.  
  713. end
  714.  
  715. end
  716.  
  717. --cli:logout()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement