Graph database Analysis of the Steam Network
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

341 lines
11 KiB

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Jrtechs Steam Friend Graph Project</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  8. <link rel="stylesheet" href="css/bootstrap.css" media="screen">
  9. <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
  10. <script src="src/sigma.core.js"></script>
  11. <script src="src/conrad.js"></script>
  12. <script src="src/utils/sigma.utils.js"></script>
  13. <script src="src/utils/sigma.polyfills.js"></script>
  14. <script src="src/sigma.settings.js"></script>
  15. <script src="src/classes/sigma.classes.dispatcher.js"></script>
  16. <script src="src/classes/sigma.classes.configurable.js"></script>
  17. <script src="src/classes/sigma.classes.graph.js"></script>
  18. <script src="src/classes/sigma.classes.camera.js"></script>
  19. <script src="src/classes/sigma.classes.quad.js"></script>
  20. <script src="src/classes/sigma.classes.edgequad.js"></script>
  21. <script src="src/captors/sigma.captors.mouse.js"></script>
  22. <script src="src/captors/sigma.captors.touch.js"></script>
  23. <script src="src/renderers/sigma.renderers.canvas.js"></script>
  24. <script src="src/renderers/sigma.renderers.webgl.js"></script>
  25. <script src="src/renderers/sigma.renderers.svg.js"></script>
  26. <script src="src/renderers/sigma.renderers.def.js"></script>
  27. <script src="src/renderers/webgl/sigma.webgl.nodes.def.js"></script>
  28. <script src="src/renderers/webgl/sigma.webgl.nodes.fast.js"></script>
  29. <script src="src/renderers/webgl/sigma.webgl.edges.def.js"></script>
  30. <script src="src/renderers/webgl/sigma.webgl.edges.fast.js"></script>
  31. <script src="src/renderers/webgl/sigma.webgl.edges.arrow.js"></script>
  32. <script src="src/renderers/canvas/sigma.canvas.labels.def.js"></script>
  33. <script src="src/renderers/canvas/sigma.canvas.hovers.def.js"></script>
  34. <script src="src/renderers/canvas/sigma.canvas.nodes.def.js"></script>
  35. <script src="src/renderers/canvas/sigma.canvas.edges.def.js"></script>
  36. <script src="src/renderers/canvas/sigma.canvas.edges.curve.js"></script>
  37. <script src="src/renderers/canvas/sigma.canvas.edges.arrow.js"></script>
  38. <script src="src/renderers/canvas/sigma.canvas.edges.curvedArrow.js"></script>
  39. <script src="src/renderers/canvas/sigma.canvas.edgehovers.def.js"></script>
  40. <script src="src/renderers/canvas/sigma.canvas.edgehovers.curve.js"></script>
  41. <script src="src/renderers/canvas/sigma.canvas.edgehovers.arrow.js"></script>
  42. <script src="src/renderers/canvas/sigma.canvas.edgehovers.curvedArrow.js"></script>
  43. <script src="src/renderers/canvas/sigma.canvas.extremities.def.js"></script>
  44. <script src="src/renderers/svg/sigma.svg.utils.js"></script>
  45. <script src="src/renderers/svg/sigma.svg.nodes.def.js"></script>
  46. <script src="src/renderers/svg/sigma.svg.edges.def.js"></script>
  47. <script src="src/renderers/svg/sigma.svg.edges.curve.js"></script>
  48. <script src="src/renderers/svg/sigma.svg.labels.def.js"></script>
  49. <script src="src/renderers/svg/sigma.svg.hovers.def.js"></script>
  50. <script src="src/middlewares/sigma.middlewares.rescale.js"></script>
  51. <script src="src/middlewares/sigma.middlewares.copy.js"></script>
  52. <script src="src/misc/sigma.misc.animation.js"></script>
  53. <script src="src/misc/sigma.misc.bindEvents.js"></script>
  54. <script src="src/misc/sigma.misc.bindDOMEvents.js"></script>
  55. <script src="src/misc/sigma.misc.drawHovers.js"></script>
  56. <script src="src/plugins/sigma.plugins.neighborhoods/sigma.plugins.neighborhoods.js"></script>
  57. <script src="src/plugins/sigma.layout.forceAtlas2/supervisor.js"></script>
  58. <script src="src/plugins/sigma.layout.forceAtlas2/worker.js"></script>
  59. <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
  60. </head>
  61. <body>
  62. <div class="navbar navbar-expand-lg fixed-top navbar-dark bg-primary">
  63. <div class="container">
  64. <a href="index.html" class="navbar-brand">Jrtechs Steam Graph Project</a>
  65. <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
  66. <span class="navbar-toggler-icon"></span>
  67. </button>
  68. <div class="collapse navbar-collapse" id="navbarResponsive">
  69. <ul class="navbar-nav">
  70. <li class="nav-item">
  71. <a class="nav-link" href="graphs.html">Graphs</a>
  72. </li>
  73. <li class="nav-item">
  74. <a class="nav-link" href="https://jrtechs.net">Blog</a>
  75. </li>
  76. <li class="nav-item">
  77. <a class="nav-link" href="https://jrtechs.me">Resume</a>
  78. </li>
  79. <li class="nav-item">
  80. <a class="nav-link" href="https://github.com/jrtechs">Github</a>
  81. </li>
  82. </ul>
  83. </div>
  84. </div>
  85. </div>
  86. <!-- END SIGMA IMPORTS -->
  87. <div id="container">
  88. <style>
  89. #graph-container {
  90. top: 0;
  91. bottom: 0;
  92. left: 0;
  93. right: 0;
  94. position: absolute;
  95. /*background-color: #455660;*/
  96. }
  97. .sigma-node:hover {
  98. fill: blue;
  99. }
  100. .muted {
  101. fill-opacity: 0.1;
  102. stroke-opacity: 0.1;
  103. font-size: 0;
  104. }
  105. </style>
  106. <div id="graph-container" style="width:100%; height:100%"></div>
  107. </div>
  108. <script>
  109. var s,
  110. g = {
  111. nodes: [],
  112. edges: []
  113. },
  114. colors = [
  115. // '#617db4',
  116. // '#668f3c',
  117. // '#c6583e',
  118. // '#b956af',
  119. // '#ac80a0',
  120. // '#c2cae8',
  121. // '#8380b6',
  122. // '#738290'
  123. '#4281a4',
  124. '#5da9e9',
  125. '#003f91',
  126. '#b793ae',
  127. '#6d326d'
  128. ];
  129. // Instantiate sigma:
  130. s = new sigma({
  131. graph: g,
  132. settings: {
  133. enableHovering: false
  134. }
  135. });
  136. s.addRenderer({
  137. id: 'main',
  138. type: 'svg',
  139. container: document.getElementById('graph-container'),
  140. freeStyle: true
  141. });
  142. getData = getUrlVars();
  143. connection = new WebSocket('ws://localhost:4444');
  144. connection.onopen = function ()
  145. {
  146. console.log('Connected!');
  147. if(getData["id"] != undefined && getData["id"] != "")
  148. {
  149. connection.send("{id:'" + getData["id"] + "', graph:" + getData["graph"] + "}");
  150. }
  151. else
  152. {
  153. connection.close();
  154. }
  155. };
  156. // Log errors
  157. connection.onerror = function (error)
  158. {
  159. console.log('WebSocket Error ' + error);
  160. };
  161. function getUrlVars()
  162. {
  163. var vars = {};
  164. var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
  165. vars[key] = value;
  166. });
  167. return vars;
  168. }
  169. function addNodeToGraph(request)
  170. {
  171. if(s.graph.nodes(request.id) == undefined)
  172. {
  173. s.graph.addNode({
  174. id: request.id,
  175. label: request.name,
  176. x: request.x,
  177. y: request.y,
  178. size: request.size,
  179. color: colors[Math.floor(Math.random() * colors.length)]
  180. });
  181. s.refresh();
  182. }
  183. }
  184. function addEdgeToGraph(request)
  185. {
  186. s.graph.addEdge({
  187. id: request.id,
  188. source: request.p1,
  189. target: request.p2,
  190. size: 1
  191. });
  192. s.refresh();
  193. }
  194. // Log messages from the server
  195. connection.onmessage = function (e)
  196. {
  197. var request = JSON.parse(e.data);
  198. if(request.action == 1)
  199. {
  200. addNodeToGraph(request);
  201. }
  202. else if(request.action == 2)
  203. {
  204. addEdgeToGraph(request);
  205. }
  206. else if(request.action == 3)
  207. {
  208. s.startForceAtlas2({worker: true, barnesHutOptimize: false, scalingRatio: 0.5, slowDown: 5, gravity: 20});
  209. setTimeout(function ()
  210. {
  211. s.stopForceAtlas2();
  212. }, 30000);
  213. }
  214. };
  215. //jquery stuff for hiding and displaying users when clicked
  216. s.bind('clickNode doubleClickNode rightClickNode', function(e)
  217. {
  218. console.log(e.type, e);
  219. $('.sigma-node, .sigma-edge').each(function()
  220. {
  221. mute(this);
  222. });
  223. var neighbors = s.graph.neighborhood(e.data.node.id);
  224. neighbors.nodes.forEach(function(node)
  225. {
  226. unmute($('[data-node-id="' + node.id + '"]')[0]);
  227. });
  228. neighbors.edges.forEach(function(edge) {
  229. unmute($('[data-edge-id="' + edge.id + '"]')[0]);
  230. });
  231. });
  232. // Binding silly interactions
  233. function mute(node)
  234. {
  235. if (!~node.getAttribute('class').search(/muted/))
  236. node.setAttributeNS(null, 'class', node.getAttribute('class') + ' muted');
  237. }
  238. function unmute(node)
  239. {
  240. node.setAttributeNS(null, 'class', node.getAttribute('class').replace(/(\s|^)muted(\s|$)/g, '$2'));
  241. }
  242. $('.sigma-node').click(function()
  243. {
  244. console.log("click");
  245. $('.sigma-node, .sigma-edge').each(function()
  246. {
  247. mute(this);
  248. });
  249. // Unmuting neighbors
  250. var neighbors = s.graph.neighborhood($(this).attr('data-node-id'));
  251. neighbors.nodes.forEach(function(node)
  252. {
  253. unmute($('[data-node-id="' + node.id + '"]')[0]);
  254. });
  255. neighbors.edges.forEach(function(edge)
  256. {
  257. unmute($('[data-edge-id="' + edge.id + '"]')[0]);
  258. });
  259. });
  260. s.bind('clickStage', function()
  261. {
  262. $('.sigma-node, .sigma-edge').each(function()
  263. {
  264. unmute(this);
  265. });
  266. });
  267. </script>
  268. <!-
  269. ┈┈╱▔▔▔▔▔╲┈┈┈HM┈HM
  270. ┈╱┈┈╱▔╲╲╲▏┈┈┈HMMM
  271. ╱┈┈╱━╱▔▔▔▔▔╲━╮┈┈
  272. ▏┈▕┃▕╱▔╲╱▔╲▕╮┃┈┈
  273. ▏┈▕╰━▏▊▕▕▋▕▕━╯┈┈
  274. ╲┈┈╲╱▔╭╮▔▔┳╲╲┈┈┈
  275. ┈╲┈┈▏╭━━━━╯▕▕┈┈┈
  276. ┈┈╲┈╲▂▂▂▂▂▂╱╱┈┈┈
  277. ┈┈┈┈▏┊┈┈┈┈┊┈┈┈╲┈
  278. ┈┈┈┈▏┊┈┈┈┈┊▕╲┈┈╲
  279. ┈╱▔╲▏┊┈┈┈┈┊▕╱▔╲▕
  280. ┈▏ ┈┈┈╰┈┈┈┈╯┈┈┈▕▕
  281. ┈╲┈┈┈╲┈┈┈┈╱┈┈┈╱┈╲
  282. ┈┈╲┈┈▕▔▔▔▔▏┈┈╱╲╲╲▏
  283. ┈╱▔┈┈▕┈┈┈┈▏┈┈▔╲▔▔
  284. ┈╲▂▂▂╱┈┈┈┈╲▂▂▂╱┈
  285. If you are seeing this monkey that means that you are interested in my
  286. code. Yay!! If you are not here to hack me ... you should really consider
  287. contributing to some of my public projects on github.
  288. https://github.com/jrtechs
  289. -->
  290. <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
  291. <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
  292. </body>
  293. </html>