Newer
Older
moodlog_web / index.php
root on 7 May 2019 16 KB Initial commit
  1. <?php
  2. /*
  3. ini_set('display_errors', 1);
  4. ini_set('display_startup_errors', 1);
  5. error_reporting(E_ALL);
  6. */
  7. session_start();
  8. include('config.php');
  9. $error = "";
  10.  
  11. if(isset($_REQUEST['password']) && md5($_REQUEST['password']) == $password){
  12. $_SESSION['loggedin'] = true;
  13. }
  14.  
  15. if(!isset($_SESSION['loggedin']) || isset($_GET['logout'])){
  16. if(isset($_SESSION['loggedin']))
  17. unset($_SESSION['loggedin']);
  18. include('login.html');
  19. die();
  20. }
  21.  
  22. /***
  23. * actions here for API / AJAX
  24. */
  25. if(isset($_GET['action'])){
  26. switch ($_GET['action']) {
  27. case 'main_cal': // get unfiltered main cal averages - output JSON
  28. header('Content-Type: application/json');
  29. $result = main_cal();
  30. echo "{".$result."}";
  31. break;
  32. case 'filtered_cal': // get filtered main cal averages (filter=+test-test@test-test...) - output JSON
  33. header('Content-Type: application/json');
  34. if(isset($_GET['filter'])){
  35. $result = filtered_cal($_GET['filter']);
  36. echo "{".$result."}";
  37. }else{
  38. echo "0";
  39. }
  40. break;
  41. case 'date': // get specific date's log - output HTML
  42. if(isset($_GET['date'])){
  43. $result = today($_GET['date']);
  44. echo $result;
  45. }else{
  46. echo "0";
  47. }
  48. break;
  49. case 'date_average': // get specific date's average - output no.
  50. if(isset($_GET['date'])){
  51. $result = day_avg($_GET['date']);
  52. echo $result;
  53. }else{
  54. echo "0";
  55. }
  56. break;
  57. case 'latest': // get latest 5 tags - output JSON
  58. if(isset($_GET['tag'])){
  59. $result = latest($_GET['tag']);
  60. echo $result;
  61. }else{
  62. echo "0";
  63. }
  64. break;
  65. case 'top': // get top 5 tags - output JSON
  66. if(isset($_GET['tag'])){
  67. $result = toptag($_GET['tag']);
  68. echo $result;
  69. }else{
  70. echo "0";
  71. }
  72. break;
  73. case 'alltag': // get all tags in popularity order - output JSON
  74. $result = alltag();
  75. echo $result;
  76. break;
  77. case 'save':
  78. if(isset($_GET['log'])){ // save a new moodlog
  79. $result = new_log($_GET['log']);
  80. echo $result;
  81. }else{
  82. echo "0";
  83. }
  84. break;
  85. default:
  86. # code...
  87. break;
  88. }
  89. die();
  90. }
  91.  
  92. //$result = today("2018-09-13");
  93. //echo $result;
  94.  
  95. function today($ymd){
  96. global $moodlog;
  97. $ymd = strtotime($ymd);
  98. $dateTime = new \DateTime(null, new DateTimeZone('Europe/London'));
  99. $dateTime->setTimestamp($ymd);
  100. $date = $dateTime->format('Y-m-d');
  101. $ymd2 = date("Y-m-d", strtotime("$date"));
  102. //echo $ymd2;
  103.  
  104. $returnstring = "<div class=\"sub-header\">$justdate</div>\n";
  105. $count = 0;
  106.  
  107. $moodfile = @fopen($moodlog, "r");
  108. if ($moodfile) {
  109. while (($line = fgets($moodfile)) !== false) {
  110. /***
  111. * if date < cutoff stop adding
  112. */
  113. $cutoff = $date = strtotime(date("Y-m-d", strtotime("$ymd2 -0 day")));
  114.  
  115. $newpos = array();
  116. $newneg = array();
  117. $newcon = array();
  118. $newstr = "";
  119.  
  120. $split1 = explode("[", $line);
  121. $split2 = explode("]", $split1[1]);
  122. $words = explode(" ", $split2[1]);
  123. foreach($words as $word){
  124. if($word <> ""){
  125. switch (mb_substr($word[0], 0, 1)) {
  126. case '+':
  127. $newpos[] = $word;
  128. break;
  129. case '-':
  130. $newneg[] = $word;
  131. break;
  132. case '@':
  133. $newcon[] = $word;
  134. break;
  135. default:
  136. $newstr .= " $word";
  137. break;
  138. }
  139. }
  140. }
  141.  
  142. $datetime = $split1[0];
  143. if(strtotime($datetime) < $cutoff)
  144. break;
  145. $justdate = date("Y-m-d", strtotime($datetime));
  146. if(strtotime($ymd2) == strtotime($justdate)){
  147. $count++;
  148. $mood = $split2[0];
  149. $fulldate = date("Y-m-d H:i", strtotime($datetime));
  150. $returnstring .= "<span class=\"datehist\">$fulldate</span>\n<span class=\"hpyhist\">[$mood]</span><span class=\"pretexthist\">$newstr</span>\n";
  151.  
  152. foreach($newpos as $pos)
  153. $returnstring .= "<span class=\"preposhist\" onclick=\"addFilterPos($(this).text());\">$pos</span>\n";
  154. foreach($newneg as $neg)
  155. $returnstring .= "<span class=\"preneghist\" onclick=\"addFilterNeg($(this).text());\">$neg</span>\n";
  156. foreach($newcon as $con)
  157. $returnstring .= "<span class=\"preconhist\" onclick=\"addFilterCon($(this).text());\">$con</span>\n";
  158. $returnstring .= "<br />";
  159. }
  160. }
  161. fclose($moodfile);
  162. return ($count > 0)? $returnstring : "0";
  163. } else {
  164. return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!<br />";
  165. }
  166. }
  167.  
  168. function main_cal(){
  169. global $moodlog;
  170. $toreturn = "";
  171. $moodfile = @fopen($moodlog, "r");
  172. if ($moodfile) {
  173. $newtimes = array();
  174. while (($line = fgets($moodfile)) !== false) {
  175. /***
  176. * if date < cutoff stop adding
  177. */
  178. $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month")));
  179.  
  180. $split1 = explode("[", $line);
  181. $split2 = explode("]", $split1[1]);
  182.  
  183. $datetime = $split1[0];
  184. if(strtotime($datetime) < $cutoff)
  185. break;
  186.  
  187. $mood = $split2[0];
  188. //$justdate = date("Y-m-d", strtotime($datetime));
  189. //$dt2 = explode("-", $datetime);
  190. //$dtd = explode(" ", $dt2[2]);
  191. //$dateTime = new \DateTime(null, new DateTimeZone('Europe/London'));
  192. //$dateTime->setDate($dt2[0], $dt2[1], $dtd[0]);
  193. //$justdate = $dateTime->format('Y-m-d');
  194. $dtd = explode(" ", $datetime);
  195. $justdate = $dtd[0];
  196.  
  197. $newtimes[$justdate][] = $mood;
  198. }
  199. fclose($moodfile);
  200. foreach($newtimes as $date=>$md){
  201. $average = round(array_sum($md) / count($md));
  202. //$datetime = strtotime($date);
  203. $dt22 = explode("-", $date);
  204. $dtd2 = explode(" ", $dt22[2]);
  205. $dateTime = new \DateTime(null, new DateTimeZone('Europe/London'));
  206. $dateTime->setDate($dt22[0], $dt22[1], $dtd2[0]);
  207. $justdate2 = $dateTime->getTimestamp();
  208.  
  209. $toreturn .= "\"$justdate2\":$average,";
  210. }
  211.  
  212. return substr($toreturn, 0, -1);
  213. } else {
  214. return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!<br />";
  215. }
  216. }
  217.  
  218. function filtered_cal($filter){
  219. global $moodlog;
  220. $toreturn = "";
  221.  
  222. $pattern = '/(?=[+-@][a-zA-Z0-9])/';
  223. $limit = -1;
  224. $flags = PREG_SPLIT_NO_EMPTY;
  225. $tags = preg_split ($pattern, $filter, $limit, $flags);
  226.  
  227. $moodfile = @fopen($moodlog, "r");
  228. if ($moodfile) {
  229. $newtimes = array();
  230. while (($line = fgets($moodfile)) !== false) {
  231. /***
  232. * if date < cutoff stop adding
  233. */
  234. $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month")));
  235.  
  236. $split1 = explode("[", $line);
  237. $split2 = explode("]", $split1[1]);
  238.  
  239. $datetime = $split1[0];
  240. if(strtotime($datetime) < $cutoff)
  241. break;
  242.  
  243. $mood = $split2[0];
  244. $justdate = date("Y-m-d", strtotime($datetime));
  245.  
  246. $words = explode(" ", $split2[1]);
  247. foreach($words as $word){
  248. $word = trim($word);
  249. if (in_array($word, $tags, true))
  250. $newtimes[$justdate][] = $mood;
  251. }
  252. }
  253. fclose($moodfile);
  254. foreach($newtimes as $date=>$md){
  255. $average = round(array_sum($md) / count($md));
  256. $datetime = strtotime("$date");
  257. $toreturn .= "\"$datetime\":$average,";
  258. }
  259.  
  260. return substr($toreturn, 0, -1);
  261. } else {
  262. return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!<br />";
  263. }
  264. }
  265.  
  266. function day_avg($ymd){
  267. global $moodlog;
  268. $mood = array();
  269. $average = 0;
  270.  
  271. $moodfile = @fopen($moodlog, "r");
  272. //$date = date("Y-m-d", $ymd);
  273. //$date = date("Y-m-d", strtotime("$date +1 day"));
  274.  
  275. $dateTime = new \DateTime(null, new DateTimeZone('Europe/London'));
  276. $dateTime->setTimestamp($ymd);
  277. $date = $dateTime->format('Y-m-d');
  278. $date = date("Y-m-d", strtotime("$date"));
  279.  
  280. //$currentTime = new DateTime();
  281. //$currentTime = DateTime::createFromFormat( 'U', $ymd );
  282. //$date = $currentTime->format( 'c' );
  283.  
  284. $cutoff = strtotime("$date -0 day");
  285. //echo $date." cutoff: ".$cutoff;
  286. //$date = new DateTime();
  287. //$date->setTimestamp($ymd);
  288. //echo $date->format('U = Y-m-d H:i:s') . "\n";
  289.  
  290. if ($moodfile) {
  291. while (($line = fgets($moodfile)) !== false) {
  292.  
  293. $split1 = explode("[", $line);
  294. $split2 = explode("]", $split1[1]);
  295.  
  296. $datetime = $split1[0];
  297. if(strtotime($datetime) < $cutoff)
  298. break;
  299.  
  300. if(strncmp($date, $datetime, 10) == 0 )
  301. $mood[] = $split2[0];
  302. }
  303. // echo "$ymd ";
  304. // echo $date;
  305. // print_r($mood);
  306. if($mood)
  307. $average = round(array_sum($mood) / count($mood));
  308. return $average;
  309. } else {
  310. return "0";
  311. }
  312. }
  313.  
  314. function latest($tag){
  315. global $moodlog;
  316. $count = 0;
  317.  
  318. $newpos = array();
  319. $newneg = array();
  320. $newcon = array();
  321.  
  322. $moodfile = @fopen($moodlog, "r");
  323. if ($moodfile) {
  324. while (($line = fgets($moodfile)) !== false) {
  325.  
  326. $newstr = "";
  327.  
  328. $split1 = explode("[", $line);
  329. $split2 = explode("]", $split1[1]);
  330. $words = explode(" ", $split2[1]);
  331. foreach($words as $word){
  332. if($word <> ""){
  333. switch (mb_substr($word[0], 0, 1)) {
  334. case '+':
  335. $newpos[] = trim($word);
  336. break;
  337. case '-':
  338. $newneg[] = trim($word);
  339. break;
  340. case '@':
  341. $newcon[] = trim($word);
  342. break;
  343. }
  344. }
  345. }
  346.  
  347. }
  348. fclose($moodfile);
  349. switch ($tag) {
  350. case 'pos':
  351. $newpos = array_unique($newpos);
  352. $newArray = array_slice($newpos, 0, 5, false);
  353. break;
  354. case 'neg':
  355. $newneg = array_unique($newneg);
  356. $newArray = array_slice($newneg, 0, 5, false);
  357. break;
  358. case 'con':
  359. $newcon = array_unique($newcon);
  360. $newArray = array_slice($newcon, 0, 5, false);
  361. break;
  362. default:
  363. return 0;
  364. break;
  365. }
  366. return json_encode($newArray);
  367. } else {
  368. return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!<br />";
  369. }
  370. }
  371.  
  372. function toptag($tag){
  373. global $moodlog;
  374. $count = 0;
  375.  
  376. $newpos = array();
  377. $newneg = array();
  378. $newcon = array();
  379.  
  380. $moodfile = @fopen($moodlog, "r");
  381. if ($moodfile) {
  382. while (($line = fgets($moodfile)) !== false) {
  383.  
  384. $newstr = "";
  385.  
  386. $split1 = explode("[", $line);
  387. $split2 = explode("]", $split1[1]);
  388. $words = explode(" ", $split2[1]);
  389. foreach($words as $word){
  390. if($word <> ""){
  391. switch (mb_substr($word[0], 0, 1)) {
  392. case '+':
  393. $newpos[] = trim($word);
  394. break;
  395. case '-':
  396. $newneg[] = trim($word);
  397. break;
  398. case '@':
  399. $newcon[] = trim($word);
  400. break;
  401. }
  402. }
  403. }
  404.  
  405. }
  406. fclose($moodfile);
  407. switch ($tag) {
  408. case 'pos':
  409. $acv=array_count_values($newpos);
  410. arsort($acv);
  411. $result=array_keys($acv);
  412. $newArray = array_slice($result, 0, 5, false);
  413. break;
  414. case 'neg':
  415. $acv=array_count_values($newneg);
  416. arsort($acv);
  417. $result=array_keys($acv);
  418. $newArray = array_slice($result, 0, 5, false);
  419. break;
  420. case 'con':
  421. $acv=array_count_values($newcon);
  422. arsort($acv);
  423. $result=array_keys($acv);
  424. $newArray = array_slice($result, 0, 5, false);
  425. break;
  426. default:
  427. return 0;
  428. break;
  429. }
  430. return json_encode($newArray);
  431. } else {
  432. return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!<br />";
  433. }
  434. }
  435.  
  436. function alltag(){
  437. global $moodlog;
  438. $count = 0;
  439.  
  440. $newtag= array();
  441.  
  442. $moodfile = @fopen($moodlog, "r");
  443. if ($moodfile) {
  444. while (($line = fgets($moodfile)) !== false) {
  445.  
  446. $newstr = "";
  447.  
  448. $split1 = explode("[", $line);
  449. $split2 = explode("]", $split1[1]);
  450. $words = explode(" ", $split2[1]);
  451. foreach($words as $word){
  452. if($word <> ""){
  453. switch (mb_substr($word[0], 0, 1)) {
  454. case '+':
  455. $newtag[] = trim($word);
  456. break;
  457. case '-':
  458. $newtag[] = trim($word);
  459. break;
  460. case '@':
  461. $newtag[] = trim($word);
  462. break;
  463. }
  464. }
  465. }
  466. }
  467. fclose($moodfile);
  468. $acv=array_count_values($newtag);
  469. arsort($acv);
  470. $result=array_keys($acv);
  471. return json_encode($result);
  472. } else {
  473. return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!<br />";
  474. }
  475. }
  476.  
  477. function new_log($log){
  478. global $moodlog;
  479. $pattern = '/(?=[+-@|][a-zA-Z0-9])/';
  480. $limit = -1;
  481. $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE;
  482. $result = preg_split ($pattern, $log, $limit, $flags);
  483. //print_r($result);
  484.  
  485. $timestamp = date("Y-m-d H:i");
  486. $no = rtrim($result[0], "|");
  487. $msg = "";
  488. $pos = "";
  489. $neg = "";
  490. $con = "";
  491.  
  492. foreach($result as $item){
  493. switch ($item[0]) {
  494. case '|':
  495. $msg .= substr($item, 1)." ";
  496. break;
  497. case '+':
  498. $pos .= "$item ";
  499. break;
  500. case '-':
  501. $neg .= "$item ";
  502. break;
  503. case '@':
  504. $con .= "$item ";
  505. break;
  506. }
  507. }
  508. $toadd = "$timestamp [$no] ".$msg.$pos.$neg.$con."\n";
  509. $toadd .= file_get_contents($moodlog);
  510. file_put_contents($moodlog, $toadd);
  511. echo "1";
  512. }
  513.  
  514. ?>
  515.  
  516. <html>
  517. <head>
  518.  
  519. <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
  520. <script type="text/javascript" src="https://d3js.org/d3.v3.min.js"></script>
  521. <script type="text/javascript" src="https://cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.min.js"></script>
  522. <link rel="stylesheet" href="https://cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.css" />
  523. <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700" rel="stylesheet">
  524. <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  525. <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
  526. <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  527. <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  528. <link rel="stylesheet" href="style.css" >
  529. </head>
  530. <body>
  531. <center>
  532. <?php if($error <> ""){echo $error; } ?>
  533.  
  534. <div class="banner">
  535. <div class="header"><a href="/?logout"><i class="fas fa-heartbeat" ></i></a> moodlog.txt</div>
  536.  
  537. <div class="new-log">
  538. <input type="range" id="happyval" value="5" min="1" max="10"/>
  539. <input class="input" id="tags" placeholder="(+,-,@) description"/>
  540. <input type="button" value="+" onClick="updatePretext();"/>
  541. <input type="button" value="add" class="add" onClick="submitMood();"/>
  542. </div>
  543. <div class="preview">
  544. <span class="date">2018-09-11 20:27</span><span class="hpyno">[5]</span><span class="pretext" onClick="updatePretext();"></span></div>
  545.  
  546. <div class="filter" style="display:none">
  547. <span class="filtitle">Filters:</span>
  548. <span class="fas fa-search" style="float:right;font-size:15px;" onclick="applyFilters();"></span>
  549. </div>
  550. </div>
  551.  
  552. <div id="cal-heatmap"></div>
  553.  
  554. <div class="top10s">
  555. <div class="toppos">
  556. <div class="sub-header">Top 5 positive</div>
  557. </div>
  558. <div class="topneg">
  559. <div class="sub-header">Top 5 negative</div>
  560. </div>
  561. <div class="topcon">
  562. <div class="sub-header">Top 5 context</div>
  563. </div>
  564. <div class="latpos">
  565. <div class="sub-header">Latest 5 positive</div>
  566. </div>
  567. <div class="latneg">
  568. <div class="sub-header">Latest 5 negative</div>
  569. </div>
  570. <div class="latcon">
  571. <div class="sub-header">Latest 5 context</div>
  572. </div>
  573. </div>
  574.  
  575. <div class="fullday">
  576. <div class="previewhist">
  577. <?php
  578. $result = today(date("Y-m-d"));
  579. if($result != "0")
  580. echo $result;
  581. ?>
  582. </div>
  583. </div>
  584. </center>
  585.  
  586. <script src="script.js"></script>
  587. </body>
  588. </html>
Buy Me A Coffee