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.

330 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. }
  104. </style>
  105. <div id="graph-container" style="width:100%; height:100%"></div>
  106. </div>
  107. <script>
  108. var s,
  109. g = {
  110. nodes: [],
  111. edges: []
  112. },
  113. colors = [
  114. // '#617db4',
  115. // '#668f3c',
  116. // '#c6583e',
  117. // '#b956af',
  118. // '#ac80a0',
  119. // '#c2cae8',
  120. // '#8380b6',
  121. // '#738290'
  122. '#4281a4',
  123. '#5da9e9',
  124. '#003f91',
  125. '#b793ae',
  126. '#6d326d'
  127. ];
  128. // Instantiate sigma:
  129. s = new sigma({
  130. graph: g,
  131. settings: {
  132. enableHovering: false
  133. }
  134. });
  135. s.addRenderer({
  136. id: 'main',
  137. type: 'svg',
  138. container: document.getElementById('graph-container'),
  139. freeStyle: true
  140. });
  141. getData = getUrlVars();
  142. connection = new WebSocket('ws://localhost:4444');
  143. connection.onopen = function ()
  144. {
  145. console.log('Connected!');
  146. if(getData["id"] != undefined && getData["id"] != "")
  147. {
  148. connection.send("{id:'" + getData["id"] + "', graph:" + getData["graph"] + "}");
  149. }
  150. else
  151. {
  152. connection.close();
  153. }
  154. };
  155. // Log errors
  156. connection.onerror = function (error)
  157. {
  158. console.log('WebSocket Error ' + error);
  159. };
  160. function getUrlVars()
  161. {
  162. var vars = {};
  163. var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
  164. vars[key] = value;
  165. });
  166. return vars;
  167. }
  168. function addNodeToGraph(request)
  169. {
  170. if(s.graph.nodes(request.id) == undefined)
  171. {
  172. s.graph.addNode({
  173. id: request.id,
  174. label: request.name,
  175. x: request.x,
  176. y: request.y,
  177. size: request.size,
  178. color: colors[Math.floor(Math.random() * colors.length)]
  179. });
  180. s.refresh();
  181. }
  182. }
  183. function addEdgeToGraph(request)
  184. {
  185. s.graph.addEdge({
  186. id: request.id,
  187. source: request.p1,
  188. target: request.p2,
  189. size: 1
  190. });
  191. s.refresh();
  192. }
  193. // Log messages from the server
  194. connection.onmessage = function (e)
  195. {
  196. var request = JSON.parse(e.data);
  197. if(request.action == 1)
  198. {
  199. addNodeToGraph(request);
  200. }
  201. else if(request.action == 2)
  202. {
  203. addEdgeToGraph(request);
  204. }
  205. };
  206. //jquery stuff for hiding and displaying users when clicked
  207. s.bind('clickNode doubleClickNode rightClickNode', function(e)
  208. {
  209. console.log(e.type, e);
  210. $('.sigma-node, .sigma-edge').each(function()
  211. {
  212. mute(this);
  213. });
  214. var neighbors = s.graph.neighborhood(e.data.node.id);
  215. neighbors.nodes.forEach(function(node)
  216. {
  217. unmute($('[data-node-id="' + node.id + '"]')[0]);
  218. });
  219. neighbors.edges.forEach(function(edge) {
  220. unmute($('[data-edge-id="' + edge.id + '"]')[0]);
  221. });
  222. });
  223. // Binding silly interactions
  224. function mute(node)
  225. {
  226. if (!~node.getAttribute('class').search(/muted/))
  227. node.setAttributeNS(null, 'class', node.getAttribute('class') + ' muted');
  228. }
  229. function unmute(node)
  230. {
  231. node.setAttributeNS(null, 'class', node.getAttribute('class').replace(/(\s|^)muted(\s|$)/g, '$2'));
  232. }
  233. $('.sigma-node').click(function()
  234. {
  235. console.log("click");
  236. $('.sigma-node, .sigma-edge').each(function()
  237. {
  238. mute(this);
  239. });
  240. // Unmuting neighbors
  241. var neighbors = s.graph.neighborhood($(this).attr('data-node-id'));
  242. neighbors.nodes.forEach(function(node)
  243. {
  244. unmute($('[data-node-id="' + node.id + '"]')[0]);
  245. });
  246. neighbors.edges.forEach(function(edge)
  247. {
  248. unmute($('[data-edge-id="' + edge.id + '"]')[0]);
  249. });
  250. });
  251. s.bind('clickStage', function()
  252. {
  253. $('.sigma-node, .sigma-edge').each(function()
  254. {
  255. unmute(this);
  256. });
  257. });
  258. </script>
  259. <!-
  260. ┈┈╱▔▔▔▔▔╲┈┈┈HM┈HM
  261. ┈╱┈┈╱▔╲╲╲▏┈┈┈HMMM
  262. ╱┈┈╱━╱▔▔▔▔▔╲━╮┈┈
  263. ▏┈▕┃▕╱▔╲╱▔╲▕╮┃┈┈
  264. ▏┈▕╰━▏▊▕▕▋▕▕━╯┈┈
  265. ╲┈┈╲╱▔╭╮▔▔┳╲╲┈┈┈
  266. ┈╲┈┈▏╭━━━━╯▕▕┈┈┈
  267. ┈┈╲┈╲▂▂▂▂▂▂╱╱┈┈┈
  268. ┈┈┈┈▏┊┈┈┈┈┊┈┈┈╲┈
  269. ┈┈┈┈▏┊┈┈┈┈┊▕╲┈┈╲
  270. ┈╱▔╲▏┊┈┈┈┈┊▕╱▔╲▕
  271. ┈▏ ┈┈┈╰┈┈┈┈╯┈┈┈▕▕
  272. ┈╲┈┈┈╲┈┈┈┈╱┈┈┈╱┈╲
  273. ┈┈╲┈┈▕▔▔▔▔▏┈┈╱╲╲╲▏
  274. ┈╱▔┈┈▕┈┈┈┈▏┈┈▔╲▔▔
  275. ┈╲▂▂▂╱┈┈┈┈╲▂▂▂╱┈
  276. If you are seeing this monkey that means that you are interested in my
  277. code. Yay!! If you are not here to hack me ... you should really consider
  278. contributing to some of my public projects on github.
  279. https://github.com/jrtechs
  280. -->
  281. <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>
  282. <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
  283. </body>
  284. </html>