Advertisement
az4521

Discord CLI Client Index.js

May 29th, 2019
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.20 KB | None | 0 0
  1. const blessed = require("blessed");
  2. const request = require("request");
  3. const WebSocket = require("ws");
  4. global.token = undefined;
  5. global.server = undefined;
  6. global.channel = undefined;
  7. global.servers = undefined;
  8. global.channels = undefined;
  9.  
  10. //input handler
  11. const command=function(input){
  12. cmd = input.toLowerCase().trim().split(" ");
  13. if (global.channel!=undefined) {
  14. if (cmd[0]=="/q") {
  15. screen.title=global.server.name;
  16. websocket.send(JSON.stringify({
  17. cmd: "UNSUBSCRIBE",
  18. args: {
  19. channel_id: global.channel.id
  20. },
  21. evt: "MESSAGE_CREATE",
  22. nonce: nonce
  23. }));
  24. global.channel = undefined;
  25. } else {
  26. //send message here
  27. request({
  28. url:"http://127.0.0.1:6463/channels/"+global.channel.id+"/messages",
  29. headers: {
  30. Origin:"https://discordapp.com/",
  31. Authorization: "Bearer "+global.token,
  32. },
  33. method:"POST",
  34. json:true,
  35. body: {content: cmd[0]=="/shrug"?input.replace("/shrug","")+" ¯\\_(ツ)_/¯":input}
  36. });
  37. }
  38. } else if (global.server!=undefined) {
  39. //select channel here
  40. if (["/l","/ls"].indexOf(cmd[0])+1) {
  41. list_channels(display, screen, global.channels)
  42. } else if (["/jr", "/jc", "/j"].indexOf(cmd[0])+1){
  43. if (cmd.length==2 && parseInt(cmd[1])<global.channels.length){
  44. global.channel = global.channels[parseInt(cmd[1])];
  45. screen.title = global.server.name+" - "+global.channel.name;
  46. log(display, screen, "CONNECTED TO "+global.channel.name);
  47. websocket.send(JSON.stringify({
  48. cmd: "GET_CHANNEL",
  49. args: {
  50. channel_id: global.channel.id
  51. },
  52. nonce: nonce
  53. }));
  54. }
  55. } else if (cmd[0]=="/q") {
  56. global.server = undefined;
  57. global.channels = undefined;
  58. screen.title="Discord";
  59. }
  60. } else if (global.token!=undefined) {
  61. if (["/l","/ls"].indexOf(cmd[0])+1) {
  62. list_guilds(display, screen, global.servers);
  63. } else if (["/js", "/jg", "/j"].indexOf(cmd[0])+1){
  64. if (cmd.length==2 && parseInt(cmd[1])<global.servers.length){
  65. global.server = global.servers[parseInt(cmd[1])];
  66. screen.title = global.server.name;
  67. log(display, screen, "CONNECTED TO "+global.server.name);
  68. websocket.send(JSON.stringify({
  69. nonce:nonce,
  70. cmd:"GET_CHANNELS",
  71. args:{
  72. guild_id:global.server.id
  73. }
  74. }));
  75. }
  76. } else if (cmd[0]=="/q") {
  77. return process.exit(0);
  78. }
  79. } else {
  80. log(display, screen, "COMMAND REJECTED. STILL LOADING.");
  81. }
  82. }
  83.  
  84. //display lists
  85. const tabulate = function(display, screen, list) {
  86. wid = 0
  87. for(i=0;i<list.length;i++) {
  88. wid = Math.max(display.strWidth(list[i]), wid);
  89. }
  90. wid++
  91. cols = Math.floor(display.width/wid);
  92. rows = Math.ceil(list.length/cols);
  93. for (y=0;y<rows;y++){
  94. string = ""
  95. for (x=0;x<cols;x++){
  96. if ((y*cols+x)<list.length){
  97. //diff = list[y*cols+x].length-[...list[y*cols+x]].length //fuck unicode
  98. //diff = (list[y*cols+x].match(nonspacing)||[]).length; //fuck unicode again
  99. pad = wid-display.strWidth(list[y*cols+x])
  100. string = string+list[y*cols+x]+(" ".repeat(pad));
  101. }
  102. }
  103. display.shiftLine(0);
  104. display.setLine(display.height-1, string);
  105. }
  106. screen.render();
  107. }
  108.  
  109. //data handlers
  110. const recv_messages = function(display, screen, messages){
  111. messages.forEach(function(e){
  112. recv_message(display, screen, e);
  113. });
  114. }
  115. const recv_message = function(display, screen, message){
  116. log(display, screen, message.author.username+" - "+message.content);
  117. }
  118. const recv_guilds = function(guilds){
  119. global.servers = guilds;
  120. }
  121. const recv_channels = function(channels){
  122. global.channels = channels;
  123. }
  124. const list_guilds = function(display, screen, guilds){
  125. arr=[]
  126. for (i=0; i<guilds.length; i++){
  127. arr.push("["+i+"] "+guilds[i].name);
  128. }
  129. tabulate(display, screen, arr);
  130. }
  131. const list_channels = function(display, screen, channels){
  132. arr=[]
  133. for (i=0; i<channels.length; i++){
  134. if (channels[i].type==0){
  135. arr.push("["+i+"] "+channels[i].name);
  136. }
  137. }
  138. tabulate(display, screen, arr);
  139. }
  140.  
  141.  
  142. //set up screen
  143. var screen = blessed.screen ({smartCSR: true, fullUnicode: true});
  144. screen.title = "Discord";
  145. var display = blessed.box ({
  146. fg:"white",
  147. bg:"black",
  148. width:"100%",
  149. height:"100%-1",
  150. scrollable:true,
  151. top:0,
  152. left:0,
  153. });
  154. var input = blessed.textbox ({
  155. fg:"white",
  156. bg:"black",
  157. width:"100%",
  158. height:1,
  159. scrollable:false,
  160. bottom:0,
  161. left:0,
  162. inputOnFocus:true,
  163. })
  164. input.key(["C-c"], function (ch,key){
  165. return process.exit(0);
  166. });
  167.  
  168. input.key(["escape"], function(ch,key){
  169. input.focus();
  170. });
  171.  
  172. input.key(["enter"], function(ch,key){
  173. command(input.getValue());
  174. input.clearValue();
  175. input.focus();
  176. screen.render();
  177. });
  178.  
  179. const log = function(display, screen, text) {
  180. lines = text.split(/\n/);
  181. for (i=0;i<lines.length;i++){
  182. while (!!lines[i]) {
  183. var j=lines[i].length;
  184. while (display.strWidth(lines[i].substring(0,j))>display.width) {j--}
  185. display.setLine(display.height-1, lines[i].substring(0,j));
  186. display.shiftLine(0);
  187. lines[i]=lines[i].substring(j);
  188. }
  189. }
  190. screen.render();
  191. }
  192. const clear = function (display, screen) {
  193. display.content="";
  194. screen.render();
  195. }
  196.  
  197. screen.append(display);
  198. screen.append(input);
  199. input.focus();
  200. log(display, screen, "INIT RPC CONNECTION");
  201. //set up RPC connection
  202. websocket = new WebSocket ("ws://127.0.0.1:6463/?v=1&client_id=207646673902501888", {
  203. origin:"https://discordapp.com"
  204. });
  205.  
  206. nonce=0;
  207. websocket.on("message", function (message) {
  208. data = JSON.parse(message);
  209. nonce+=1
  210. if (data.cmd=="DISPATCH" && data.evt=="READY") {
  211. request ({
  212. url:"https://streamkit.discordapp.com/overlay/token",
  213. json:true
  214. }, function(err,res,body){
  215. if (!err && res.statusCode==200) {
  216. log(display, screen, "RPC_TOKEN: "+body.rpc_token);
  217. websocket.send(JSON.stringify({
  218. cmd:"AUTHORIZE",
  219. args:{
  220. client_id:"207646673902501888",
  221. scopes: [
  222. "rpc",
  223. "rpc.api",
  224. "messages.read"
  225. ],
  226. rpc_token:body.rpc_token,
  227. },
  228. nonce:nonce
  229. }));
  230. }
  231. });
  232. } else if (data.cmd=="AUTHORIZE") {
  233. log(display, screen, "CODE: "+data.data.code);
  234. request ({
  235. url:"https://streamkit.discordapp.com/overlay/token",
  236. method:"POST",
  237. json:true,
  238. body: {
  239. code:data.data.code
  240. }
  241. }, function(err,res,body){
  242. if (!err && res.statusCode==200) {
  243. log(display, screen, "ACCESS_TOKEN: "+body.access_token);
  244. global.token = body.access_token;
  245. websocket.send (JSON.stringify({
  246. cmd:"AUTHENTICATE",
  247. args:{
  248. access_token:body.access_token
  249. },
  250. nonce:nonce
  251. }));
  252. }
  253. })
  254. } else if (data.cmd=="AUTHENTICATE") {
  255. log(display, screen, "CONNECTED");
  256. websocket.send(JSON.stringify({
  257. nonce:nonce,
  258. cmd:"GET_GUILDS",
  259. }));
  260. } else if (data.cmd=="GET_GUILDS") {
  261. recv_guilds(data.data.guilds);
  262. } else if (data.cmd=="GET_CHANNELS") {
  263. recv_channels(data.data.channels);
  264. } else if (data.cmd=="GET_CHANNEL") {
  265. recv_messages(display, screen, data.data.messages);
  266. websocket.send(JSON.stringify({
  267. cmd: "SUBSCRIBE",
  268. args: {
  269. channel_id: data.data.id
  270. },
  271. evt: "MESSAGE_CREATE",
  272. nonce: nonce
  273. }));
  274. } else if (data.cmd=="DISPATCH"&&data.evt=="MESSAGE_CREATE") {
  275. recv_message(display, screen, data.data.message);
  276. }
  277. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement