diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/example.png b/example.png new file mode 100755 index 0000000..c8851f9 --- /dev/null +++ b/example.png Binary files differ diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/example.png b/example.png new file mode 100755 index 0000000..c8851f9 --- /dev/null +++ b/example.png Binary files differ diff --git a/index.php b/index.php new file mode 100755 index 0000000..fb41358 --- /dev/null +++ b/index.php @@ -0,0 +1,612 @@ +setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $ymd2 = date("Y-m-d", strtotime("$date")); +//echo $ymd2; + + $returnstring = "
$justdate
\n"; + $count = 0; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("$ymd2 -0 day"))); + + $newpos = array(); + $newneg = array(); + $newcon = array(); + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = $word; + break; + case '-': + $newneg[] = $word; + break; + case '@': + $newcon[] = $word; + break; + default: + $newstr .= " $word"; + break; + } + } + } + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + $justdate = date("Y-m-d", strtotime($datetime)); + if(strtotime($ymd2) == strtotime($justdate)){ + $count++; + $mood = $split2[0]; + $fulldate = date("Y-m-d H:i", strtotime($datetime)); + $returnstring .= "$fulldate\n[$mood]$newstr\n"; + + foreach($newpos as $pos) + $returnstring .= "$pos\n"; + foreach($newneg as $neg) + $returnstring .= "$neg\n"; + foreach($newcon as $con) + $returnstring .= "$con\n"; + $returnstring .= "
"; + } + + } + fclose($moodfile); + return ($count > 0)? $returnstring : "0"; + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function main_cal(){ + global $moodlog; + $toreturn = ""; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + //$justdate = date("Y-m-d", strtotime($datetime)); + //$dt2 = explode("-", $datetime); + //$dtd = explode(" ", $dt2[2]); + //$dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + //$dateTime->setDate($dt2[0], $dt2[1], $dtd[0]); + //$justdate = $dateTime->format('Y-m-d'); + $dtd = explode(" ", $datetime); + $justdate = $dtd[0]; + + $newtimes[$justdate][] = $mood; + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + +//$datetime = strtotime($date); + $dt22 = explode("-", $date); + $dtd2 = explode(" ", $dt22[2]); + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setDate($dt22[0], $dt22[1], $dtd2[0]); + $justdate2 = $dateTime->getTimestamp(); + + $toreturn .= "\"$justdate2\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function filtered_cal($filter){ + global $moodlog; + $toreturn = ""; + + $pattern = '/(?=[+-@][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY; + $tags = preg_split ($pattern, $filter, $limit, $flags); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + $justdate = date("Y-m-d", strtotime($datetime)); + + $words = explode(" ", $split2[1]); + + foreach($words as $word){ + $word = trim($word); + if (in_array($word, $tags, true)) + $newtimes[$justdate][] = $mood; + } + + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + $datetime = strtotime("$date"); + $toreturn .= "\"$datetime\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function day_avg($ymd){ + global $moodlog; + $mood = array(); + $average = 0; + + $moodfile = @fopen($moodlog, "r"); + //$date = date("Y-m-d", $ymd); + //$date = date("Y-m-d", strtotime("$date +1 day")); + + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $date = date("Y-m-d", strtotime("$date")); + + //$currentTime = new DateTime(); + //$currentTime = DateTime::createFromFormat( 'U', $ymd ); + //$date = $currentTime->format( 'c' ); + + $cutoff = strtotime("$date -0 day"); + + //echo $date." cutoff: ".$cutoff; + //$date = new DateTime(); + //$date->setTimestamp($ymd); + //echo $date->format('U = Y-m-d H:i:s') . "\n"; + + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + if(strncmp($date, $datetime, 10) == 0 ) + $mood[] = $split2[0]; + } + // echo "$ymd "; + // echo $date; + // print_r($mood); + if($mood) + $average = round(array_sum($mood) / count($mood)); + return $average; + } else { + return "0"; + } +} + +function latest($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $newpos = array_unique($newpos); + $newArray = array_slice($newpos, 0, 5, false); + break; + case 'neg': + $newneg = array_unique($newneg); + $newArray = array_slice($newneg, 0, 5, false); + break; + case 'con': + $newcon = array_unique($newcon); + $newArray = array_slice($newcon, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function toptag($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $acv=array_count_values($newpos); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'neg': + $acv=array_count_values($newneg); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'con': + $acv=array_count_values($newcon); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function alltag(){ + global $moodlog; + $count = 0; + + + $newtag= array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newtag[] = trim($word); + break; + case '-': + $newtag[] = trim($word); + break; + case '@': + $newtag[] = trim($word); + break; + } + } + } + } + fclose($moodfile); + + $acv=array_count_values($newtag); + arsort($acv); + $result=array_keys($acv); + + return json_encode($result); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function new_log($log){ + global $moodlog; + $pattern = '/(?=[+-@|][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; + $result = preg_split ($pattern, $log, $limit, $flags); + //print_r($result); + + $timestamp = date("Y-m-d H:i"); + $no = rtrim($result[0], "|"); + $msg = ""; + $pos = ""; + $neg = ""; + $con = ""; + + foreach($result as $item){ + switch ($item[0]) { + case '|': + $msg .= substr($item, 1)." "; + break; + case '+': + $pos .= "$item "; + break; + case '-': + $neg .= "$item "; + break; + case '@': + $con .= "$item "; + break; + } + } + $toadd = "$timestamp [$no] ".$msg.$pos.$neg.$con."\n"; + $toadd .= file_get_contents($moodlog); + file_put_contents($moodlog, $toadd); + echo "1"; +} + +?> + + + + + + + + + + + + + + + + + +
+ ""){echo $error; } ?> + + + +
+ +
+
+
Top 5 positive
+
+
+
Top 5 negative
+
+
+
Top 5 context
+
+
+
Latest 5 positive
+
+
+
Latest 5 negative
+
+
+
Latest 5 context
+
+
+ +
+
+ + + +
+
+
+ + + + + diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/example.png b/example.png new file mode 100755 index 0000000..c8851f9 --- /dev/null +++ b/example.png Binary files differ diff --git a/index.php b/index.php new file mode 100755 index 0000000..fb41358 --- /dev/null +++ b/index.php @@ -0,0 +1,612 @@ +setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $ymd2 = date("Y-m-d", strtotime("$date")); +//echo $ymd2; + + $returnstring = "
$justdate
\n"; + $count = 0; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("$ymd2 -0 day"))); + + $newpos = array(); + $newneg = array(); + $newcon = array(); + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = $word; + break; + case '-': + $newneg[] = $word; + break; + case '@': + $newcon[] = $word; + break; + default: + $newstr .= " $word"; + break; + } + } + } + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + $justdate = date("Y-m-d", strtotime($datetime)); + if(strtotime($ymd2) == strtotime($justdate)){ + $count++; + $mood = $split2[0]; + $fulldate = date("Y-m-d H:i", strtotime($datetime)); + $returnstring .= "$fulldate\n[$mood]$newstr\n"; + + foreach($newpos as $pos) + $returnstring .= "$pos\n"; + foreach($newneg as $neg) + $returnstring .= "$neg\n"; + foreach($newcon as $con) + $returnstring .= "$con\n"; + $returnstring .= "
"; + } + + } + fclose($moodfile); + return ($count > 0)? $returnstring : "0"; + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function main_cal(){ + global $moodlog; + $toreturn = ""; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + //$justdate = date("Y-m-d", strtotime($datetime)); + //$dt2 = explode("-", $datetime); + //$dtd = explode(" ", $dt2[2]); + //$dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + //$dateTime->setDate($dt2[0], $dt2[1], $dtd[0]); + //$justdate = $dateTime->format('Y-m-d'); + $dtd = explode(" ", $datetime); + $justdate = $dtd[0]; + + $newtimes[$justdate][] = $mood; + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + +//$datetime = strtotime($date); + $dt22 = explode("-", $date); + $dtd2 = explode(" ", $dt22[2]); + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setDate($dt22[0], $dt22[1], $dtd2[0]); + $justdate2 = $dateTime->getTimestamp(); + + $toreturn .= "\"$justdate2\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function filtered_cal($filter){ + global $moodlog; + $toreturn = ""; + + $pattern = '/(?=[+-@][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY; + $tags = preg_split ($pattern, $filter, $limit, $flags); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + $justdate = date("Y-m-d", strtotime($datetime)); + + $words = explode(" ", $split2[1]); + + foreach($words as $word){ + $word = trim($word); + if (in_array($word, $tags, true)) + $newtimes[$justdate][] = $mood; + } + + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + $datetime = strtotime("$date"); + $toreturn .= "\"$datetime\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function day_avg($ymd){ + global $moodlog; + $mood = array(); + $average = 0; + + $moodfile = @fopen($moodlog, "r"); + //$date = date("Y-m-d", $ymd); + //$date = date("Y-m-d", strtotime("$date +1 day")); + + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $date = date("Y-m-d", strtotime("$date")); + + //$currentTime = new DateTime(); + //$currentTime = DateTime::createFromFormat( 'U', $ymd ); + //$date = $currentTime->format( 'c' ); + + $cutoff = strtotime("$date -0 day"); + + //echo $date." cutoff: ".$cutoff; + //$date = new DateTime(); + //$date->setTimestamp($ymd); + //echo $date->format('U = Y-m-d H:i:s') . "\n"; + + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + if(strncmp($date, $datetime, 10) == 0 ) + $mood[] = $split2[0]; + } + // echo "$ymd "; + // echo $date; + // print_r($mood); + if($mood) + $average = round(array_sum($mood) / count($mood)); + return $average; + } else { + return "0"; + } +} + +function latest($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $newpos = array_unique($newpos); + $newArray = array_slice($newpos, 0, 5, false); + break; + case 'neg': + $newneg = array_unique($newneg); + $newArray = array_slice($newneg, 0, 5, false); + break; + case 'con': + $newcon = array_unique($newcon); + $newArray = array_slice($newcon, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function toptag($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $acv=array_count_values($newpos); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'neg': + $acv=array_count_values($newneg); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'con': + $acv=array_count_values($newcon); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function alltag(){ + global $moodlog; + $count = 0; + + + $newtag= array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newtag[] = trim($word); + break; + case '-': + $newtag[] = trim($word); + break; + case '@': + $newtag[] = trim($word); + break; + } + } + } + } + fclose($moodfile); + + $acv=array_count_values($newtag); + arsort($acv); + $result=array_keys($acv); + + return json_encode($result); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function new_log($log){ + global $moodlog; + $pattern = '/(?=[+-@|][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; + $result = preg_split ($pattern, $log, $limit, $flags); + //print_r($result); + + $timestamp = date("Y-m-d H:i"); + $no = rtrim($result[0], "|"); + $msg = ""; + $pos = ""; + $neg = ""; + $con = ""; + + foreach($result as $item){ + switch ($item[0]) { + case '|': + $msg .= substr($item, 1)." "; + break; + case '+': + $pos .= "$item "; + break; + case '-': + $neg .= "$item "; + break; + case '@': + $con .= "$item "; + break; + } + } + $toadd = "$timestamp [$no] ".$msg.$pos.$neg.$con."\n"; + $toadd .= file_get_contents($moodlog); + file_put_contents($moodlog, $toadd); + echo "1"; +} + +?> + + + + + + + + + + + + + + + + + +
+ ""){echo $error; } ?> + + + +
+ +
+
+
Top 5 positive
+
+
+
Top 5 negative
+
+
+
Top 5 context
+
+
+
Latest 5 positive
+
+
+
Latest 5 negative
+
+
+
Latest 5 context
+
+
+ +
+
+ + + +
+
+
+ + + + + diff --git a/login.html b/login.html new file mode 100755 index 0000000..cf5481b --- /dev/null +++ b/login.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/example.png b/example.png new file mode 100755 index 0000000..c8851f9 --- /dev/null +++ b/example.png Binary files differ diff --git a/index.php b/index.php new file mode 100755 index 0000000..fb41358 --- /dev/null +++ b/index.php @@ -0,0 +1,612 @@ +setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $ymd2 = date("Y-m-d", strtotime("$date")); +//echo $ymd2; + + $returnstring = "
$justdate
\n"; + $count = 0; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("$ymd2 -0 day"))); + + $newpos = array(); + $newneg = array(); + $newcon = array(); + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = $word; + break; + case '-': + $newneg[] = $word; + break; + case '@': + $newcon[] = $word; + break; + default: + $newstr .= " $word"; + break; + } + } + } + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + $justdate = date("Y-m-d", strtotime($datetime)); + if(strtotime($ymd2) == strtotime($justdate)){ + $count++; + $mood = $split2[0]; + $fulldate = date("Y-m-d H:i", strtotime($datetime)); + $returnstring .= "$fulldate\n[$mood]$newstr\n"; + + foreach($newpos as $pos) + $returnstring .= "$pos\n"; + foreach($newneg as $neg) + $returnstring .= "$neg\n"; + foreach($newcon as $con) + $returnstring .= "$con\n"; + $returnstring .= "
"; + } + + } + fclose($moodfile); + return ($count > 0)? $returnstring : "0"; + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function main_cal(){ + global $moodlog; + $toreturn = ""; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + //$justdate = date("Y-m-d", strtotime($datetime)); + //$dt2 = explode("-", $datetime); + //$dtd = explode(" ", $dt2[2]); + //$dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + //$dateTime->setDate($dt2[0], $dt2[1], $dtd[0]); + //$justdate = $dateTime->format('Y-m-d'); + $dtd = explode(" ", $datetime); + $justdate = $dtd[0]; + + $newtimes[$justdate][] = $mood; + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + +//$datetime = strtotime($date); + $dt22 = explode("-", $date); + $dtd2 = explode(" ", $dt22[2]); + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setDate($dt22[0], $dt22[1], $dtd2[0]); + $justdate2 = $dateTime->getTimestamp(); + + $toreturn .= "\"$justdate2\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function filtered_cal($filter){ + global $moodlog; + $toreturn = ""; + + $pattern = '/(?=[+-@][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY; + $tags = preg_split ($pattern, $filter, $limit, $flags); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + $justdate = date("Y-m-d", strtotime($datetime)); + + $words = explode(" ", $split2[1]); + + foreach($words as $word){ + $word = trim($word); + if (in_array($word, $tags, true)) + $newtimes[$justdate][] = $mood; + } + + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + $datetime = strtotime("$date"); + $toreturn .= "\"$datetime\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function day_avg($ymd){ + global $moodlog; + $mood = array(); + $average = 0; + + $moodfile = @fopen($moodlog, "r"); + //$date = date("Y-m-d", $ymd); + //$date = date("Y-m-d", strtotime("$date +1 day")); + + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $date = date("Y-m-d", strtotime("$date")); + + //$currentTime = new DateTime(); + //$currentTime = DateTime::createFromFormat( 'U', $ymd ); + //$date = $currentTime->format( 'c' ); + + $cutoff = strtotime("$date -0 day"); + + //echo $date." cutoff: ".$cutoff; + //$date = new DateTime(); + //$date->setTimestamp($ymd); + //echo $date->format('U = Y-m-d H:i:s') . "\n"; + + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + if(strncmp($date, $datetime, 10) == 0 ) + $mood[] = $split2[0]; + } + // echo "$ymd "; + // echo $date; + // print_r($mood); + if($mood) + $average = round(array_sum($mood) / count($mood)); + return $average; + } else { + return "0"; + } +} + +function latest($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $newpos = array_unique($newpos); + $newArray = array_slice($newpos, 0, 5, false); + break; + case 'neg': + $newneg = array_unique($newneg); + $newArray = array_slice($newneg, 0, 5, false); + break; + case 'con': + $newcon = array_unique($newcon); + $newArray = array_slice($newcon, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function toptag($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $acv=array_count_values($newpos); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'neg': + $acv=array_count_values($newneg); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'con': + $acv=array_count_values($newcon); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function alltag(){ + global $moodlog; + $count = 0; + + + $newtag= array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newtag[] = trim($word); + break; + case '-': + $newtag[] = trim($word); + break; + case '@': + $newtag[] = trim($word); + break; + } + } + } + } + fclose($moodfile); + + $acv=array_count_values($newtag); + arsort($acv); + $result=array_keys($acv); + + return json_encode($result); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function new_log($log){ + global $moodlog; + $pattern = '/(?=[+-@|][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; + $result = preg_split ($pattern, $log, $limit, $flags); + //print_r($result); + + $timestamp = date("Y-m-d H:i"); + $no = rtrim($result[0], "|"); + $msg = ""; + $pos = ""; + $neg = ""; + $con = ""; + + foreach($result as $item){ + switch ($item[0]) { + case '|': + $msg .= substr($item, 1)." "; + break; + case '+': + $pos .= "$item "; + break; + case '-': + $neg .= "$item "; + break; + case '@': + $con .= "$item "; + break; + } + } + $toadd = "$timestamp [$no] ".$msg.$pos.$neg.$con."\n"; + $toadd .= file_get_contents($moodlog); + file_put_contents($moodlog, $toadd); + echo "1"; +} + +?> + + + + + + + + + + + + + + + + + +
+ ""){echo $error; } ?> + + + +
+ +
+
+
Top 5 positive
+
+
+
Top 5 negative
+
+
+
Top 5 context
+
+
+
Latest 5 positive
+
+
+
Latest 5 negative
+
+
+
Latest 5 context
+
+
+ +
+
+ + + +
+
+
+ + + + + diff --git a/login.html b/login.html new file mode 100755 index 0000000..cf5481b --- /dev/null +++ b/login.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/moodlog.txt b/moodlog.txt new file mode 100755 index 0000000..4048a5c --- /dev/null +++ b/moodlog.txt @@ -0,0 +1,25 @@ +2018-09-21 19:45 [8] nearly finished webapp +code +moodlog +2018-09-21 15:20 [7] moodlog web, new challenge coins +code @personal +2018-09-21 13:30 [5] waiting for client -waiting +phishing @work +2018-09-20 17:30 [7] tricky moodlog JS +code @personal +2018-09-20 10:00 [7] tricky phishing setup +phishing +code @work +2018-09-19 12:00 [5] -ansa @work +2018-09-18 22:00 [8] +moodlog +code @personal +2018-09-18 17:00 [6] -reporting +chill @work +2018-09-17 23:30 [7] sniper elite 4 +gaming @personal +2018-09-17 12:30 [3] -onsite @bristol +2018-09-16 20:00 [8] +newpc @personal +2018-09-15 21:00 [7] -hangover +chill +adam @personal +2018-09-14 21:00 [9] +pissup +adam +james @personal +2018-09-13 07:24 [7] new computer +excited +pissup +adam +james @personal +2018-09-13 10:22 [6] write presentation -work @work +2018-09-12 09:18 [5] +code -waiting @work +2018-09-11 18:00 [4] -knackered @work +2018-09-11 09:00 [4] -ansa @work +2018-09-10 21:00 [9] mate here +gaming @personal +2018-09-10 18:00 [8] moodlog webapp +code @personal +2018-09-10 11:30 [9] pwn3d +phishing @work +2018-09-10 08:00 [6] +phishing -earlystart -support @work +2018-09-09 23:00 [9] modlog sublime-syntax finished +code @personal +2018-09-09 15:30 [8] moodlog concept +ideas @personal +2018-09-09 13:00 [7] chilled sunday +tv +chill @personal \ No newline at end of file diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/example.png b/example.png new file mode 100755 index 0000000..c8851f9 --- /dev/null +++ b/example.png Binary files differ diff --git a/index.php b/index.php new file mode 100755 index 0000000..fb41358 --- /dev/null +++ b/index.php @@ -0,0 +1,612 @@ +setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $ymd2 = date("Y-m-d", strtotime("$date")); +//echo $ymd2; + + $returnstring = "
$justdate
\n"; + $count = 0; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("$ymd2 -0 day"))); + + $newpos = array(); + $newneg = array(); + $newcon = array(); + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = $word; + break; + case '-': + $newneg[] = $word; + break; + case '@': + $newcon[] = $word; + break; + default: + $newstr .= " $word"; + break; + } + } + } + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + $justdate = date("Y-m-d", strtotime($datetime)); + if(strtotime($ymd2) == strtotime($justdate)){ + $count++; + $mood = $split2[0]; + $fulldate = date("Y-m-d H:i", strtotime($datetime)); + $returnstring .= "$fulldate\n[$mood]$newstr\n"; + + foreach($newpos as $pos) + $returnstring .= "$pos\n"; + foreach($newneg as $neg) + $returnstring .= "$neg\n"; + foreach($newcon as $con) + $returnstring .= "$con\n"; + $returnstring .= "
"; + } + + } + fclose($moodfile); + return ($count > 0)? $returnstring : "0"; + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function main_cal(){ + global $moodlog; + $toreturn = ""; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + //$justdate = date("Y-m-d", strtotime($datetime)); + //$dt2 = explode("-", $datetime); + //$dtd = explode(" ", $dt2[2]); + //$dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + //$dateTime->setDate($dt2[0], $dt2[1], $dtd[0]); + //$justdate = $dateTime->format('Y-m-d'); + $dtd = explode(" ", $datetime); + $justdate = $dtd[0]; + + $newtimes[$justdate][] = $mood; + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + +//$datetime = strtotime($date); + $dt22 = explode("-", $date); + $dtd2 = explode(" ", $dt22[2]); + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setDate($dt22[0], $dt22[1], $dtd2[0]); + $justdate2 = $dateTime->getTimestamp(); + + $toreturn .= "\"$justdate2\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function filtered_cal($filter){ + global $moodlog; + $toreturn = ""; + + $pattern = '/(?=[+-@][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY; + $tags = preg_split ($pattern, $filter, $limit, $flags); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + $justdate = date("Y-m-d", strtotime($datetime)); + + $words = explode(" ", $split2[1]); + + foreach($words as $word){ + $word = trim($word); + if (in_array($word, $tags, true)) + $newtimes[$justdate][] = $mood; + } + + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + $datetime = strtotime("$date"); + $toreturn .= "\"$datetime\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function day_avg($ymd){ + global $moodlog; + $mood = array(); + $average = 0; + + $moodfile = @fopen($moodlog, "r"); + //$date = date("Y-m-d", $ymd); + //$date = date("Y-m-d", strtotime("$date +1 day")); + + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $date = date("Y-m-d", strtotime("$date")); + + //$currentTime = new DateTime(); + //$currentTime = DateTime::createFromFormat( 'U', $ymd ); + //$date = $currentTime->format( 'c' ); + + $cutoff = strtotime("$date -0 day"); + + //echo $date." cutoff: ".$cutoff; + //$date = new DateTime(); + //$date->setTimestamp($ymd); + //echo $date->format('U = Y-m-d H:i:s') . "\n"; + + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + if(strncmp($date, $datetime, 10) == 0 ) + $mood[] = $split2[0]; + } + // echo "$ymd "; + // echo $date; + // print_r($mood); + if($mood) + $average = round(array_sum($mood) / count($mood)); + return $average; + } else { + return "0"; + } +} + +function latest($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $newpos = array_unique($newpos); + $newArray = array_slice($newpos, 0, 5, false); + break; + case 'neg': + $newneg = array_unique($newneg); + $newArray = array_slice($newneg, 0, 5, false); + break; + case 'con': + $newcon = array_unique($newcon); + $newArray = array_slice($newcon, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function toptag($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $acv=array_count_values($newpos); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'neg': + $acv=array_count_values($newneg); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'con': + $acv=array_count_values($newcon); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function alltag(){ + global $moodlog; + $count = 0; + + + $newtag= array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newtag[] = trim($word); + break; + case '-': + $newtag[] = trim($word); + break; + case '@': + $newtag[] = trim($word); + break; + } + } + } + } + fclose($moodfile); + + $acv=array_count_values($newtag); + arsort($acv); + $result=array_keys($acv); + + return json_encode($result); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function new_log($log){ + global $moodlog; + $pattern = '/(?=[+-@|][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; + $result = preg_split ($pattern, $log, $limit, $flags); + //print_r($result); + + $timestamp = date("Y-m-d H:i"); + $no = rtrim($result[0], "|"); + $msg = ""; + $pos = ""; + $neg = ""; + $con = ""; + + foreach($result as $item){ + switch ($item[0]) { + case '|': + $msg .= substr($item, 1)." "; + break; + case '+': + $pos .= "$item "; + break; + case '-': + $neg .= "$item "; + break; + case '@': + $con .= "$item "; + break; + } + } + $toadd = "$timestamp [$no] ".$msg.$pos.$neg.$con."\n"; + $toadd .= file_get_contents($moodlog); + file_put_contents($moodlog, $toadd); + echo "1"; +} + +?> + + + + + + + + + + + + + + + + + +
+ ""){echo $error; } ?> + + + +
+ +
+
+
Top 5 positive
+
+
+
Top 5 negative
+
+
+
Top 5 context
+
+
+
Latest 5 positive
+
+
+
Latest 5 negative
+
+
+
Latest 5 context
+
+
+ +
+
+ + + +
+
+
+ + + + + diff --git a/login.html b/login.html new file mode 100755 index 0000000..cf5481b --- /dev/null +++ b/login.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/moodlog.txt b/moodlog.txt new file mode 100755 index 0000000..4048a5c --- /dev/null +++ b/moodlog.txt @@ -0,0 +1,25 @@ +2018-09-21 19:45 [8] nearly finished webapp +code +moodlog +2018-09-21 15:20 [7] moodlog web, new challenge coins +code @personal +2018-09-21 13:30 [5] waiting for client -waiting +phishing @work +2018-09-20 17:30 [7] tricky moodlog JS +code @personal +2018-09-20 10:00 [7] tricky phishing setup +phishing +code @work +2018-09-19 12:00 [5] -ansa @work +2018-09-18 22:00 [8] +moodlog +code @personal +2018-09-18 17:00 [6] -reporting +chill @work +2018-09-17 23:30 [7] sniper elite 4 +gaming @personal +2018-09-17 12:30 [3] -onsite @bristol +2018-09-16 20:00 [8] +newpc @personal +2018-09-15 21:00 [7] -hangover +chill +adam @personal +2018-09-14 21:00 [9] +pissup +adam +james @personal +2018-09-13 07:24 [7] new computer +excited +pissup +adam +james @personal +2018-09-13 10:22 [6] write presentation -work @work +2018-09-12 09:18 [5] +code -waiting @work +2018-09-11 18:00 [4] -knackered @work +2018-09-11 09:00 [4] -ansa @work +2018-09-10 21:00 [9] mate here +gaming @personal +2018-09-10 18:00 [8] moodlog webapp +code @personal +2018-09-10 11:30 [9] pwn3d +phishing @work +2018-09-10 08:00 [6] +phishing -earlystart -support @work +2018-09-09 23:00 [9] modlog sublime-syntax finished +code @personal +2018-09-09 15:30 [8] moodlog concept +ideas @personal +2018-09-09 13:00 [7] chilled sunday +tv +chill @personal \ No newline at end of file diff --git a/script.js b/script.js new file mode 100755 index 0000000..255dcc1 --- /dev/null +++ b/script.js @@ -0,0 +1,431 @@ +/*var datas = [ + {date: "2018-09-09", value: 10}, + {date: "2018-09-08", value: 5}, + {date: "2018-09-07", value: 8}, + {date: "2018-09-07", value: 7}, + {date: "2018-09-06", value: 9}, + {date: "2018-09-05", value: 6}, + {date: "2018-09-04", value: 5}, + {date: "2018-09-03", value: 4}, + {date: "2018-09-02", value: 7}, + {date: "2018-08-02", value: 1} +] + +/* +var parser = function(data) { + var stats = {}; + console.log(data); + for (var d in data) { + console.log(data[d].date); + var dateTime = new Date(data[d].date).toISOString(); + var timestamp = Math.floor(dateTime / 1000); + let toTimestamp = strDate => Date.parse(data[d].date); + stats[timestamp] = data[d].value; + } + console.log(stats); + return stats; + +}; +*/ +/* +var stats = {}; +var parser = function(data) { + //console.log(data); + for (var d in data) { + //console.log("date:"+data[d]); + //var date = new Date(data[d].date); // Date of activity + //var sec = date.getTime()/1000; // Convert to sec + stats[d] = data[d]; + //cal.subDomainTextFormat(d, data[d]); + } + + return stats; +}; +*/ +//var mainurl = "http://localhost:8080/test.json"; +var mainurl = "/?action=main_cal"; +var cal = new CalHeatMap(); + +setUpCal(); +function setUpCal(){ + var datethen = new Date(); + datethen.setMonth(datethen.getMonth() - 9); + + cal.init({ + //data: "http://localhost:8080/index.php?action=main_cal", + data: mainurl, + dataType: "json", + //afterLoadData: parser, + start: datethen, + id : "graph", + domain : "month", // Group data by month + subDomain : "day", // Split each month by days + cellSize: 15, + cellPadding: 2, + cellRadius: 3, + domainGutter:2, + subDomainTitleFormat: { + empty: "{date}", + filled: "{count} - {date}" + }, + //itemSelector: "#cal-heatmap", + range : 10, // Just display 10 months + legend: [2,3,4,5,6,7,8,9], // Custom threshold for the scale + tooltip: false, + displayLegend: false, + label: { + position: "bottom", + align: "center", + offset: {x:0,y:-10}, + }, + considerMissingDataAsZero: true, + legendHorizontalPosition: "center", + legendColors: { + min: "#6b6de5", + max: "#46e260", + }, + subDomainTextFormat: function(date ,value) { + var origdate = ""+date; + date = origdate.split('00:00:00')[0]+'00:00:00'; + var date = parseInt((new Date(date).getTime() /1000 ).toFixed(0)) + var finval = 0; + + /*** + * All of this cos of a damn bug! + * https://github.com/wa0x6e/cal-heatmap/issues/257 + */ + $.ajax({ + url: "/?action=date_average&date="+date, + async: false, + dataType: 'html', + success: function (response) { + //console.log(response); + finval = response; + console.log("origdate: "+origdate+" date: "+date+" val:"+response); + } + }); + + if (finval == 0){finval = "";} + return finval; + }, + highlight: "now", + onClick: function(date, count) { + //alert("Oh gosh, " + count + " things occured on " + date.toISOString()); + updateDayLog(date.toISOString().slice(0, 19).replace('T', ' ')); + } + }); +} + + +function checkStats(timestamp){ + var finval = 0; + $.getJSON('test.json', function (data) { + $.each(data, function(i, field){ + //console.log(field); + if(timestamp == i){ + console.log("found: "+field); + finval = field; + } + + }); + //if (finval == 0){finval = "";} + return finval; + }); + +} + +var availableTags = [ + "-ansa", + "+phishing", + "+chill", + "@home", +]; +$( function() { + + $( "#tags" ).autocomplete({ + source: availableTags + }); +} ); + +function updateTime() { + var now = new Date(); + var datestring = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2) + " " + ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2); + $("span.date").html(datestring.toString()); +} + +$("#happyval").on("input change", function() { + $(".hpyno").html("[" + $("#happyval").val() + "]"); +}); +removespan = function(span) { + span.remove(); +} + +/*** + * filter adding and removing code + */ +var filter = 0; +function addFilterPos(word){ + filter++; + $('.filtitle').after(''+word+''); + $(".filter").show(); +} +function addFilterNeg(word){ + filter++; + $('.filtitle').after(''+word+''); + $(".filter").show(); +} +function addFilterCon(word){ + filter++; + $('.filtitle').after(''+word+''); + $(".filter").show(); +} +removefilter = function(span) { + filter--; + span.remove(); + if(filter == 0){ + $(".filter").hide(); + updateCal("/?action=main_cal"); + } +} + +/*** + * updating description + */ +function updatePretext(){ + var toadd = $("#tags").val(); + switch(toadd.charAt(0)){ + case "+": + $('.pretext').after(''+toadd+''); + break; + case "-": + $('.pretext').after(''+toadd+''); + break; + case "@": + $('.preview').append(''+toadd+''); + break; + default: + $(".pretext").html( toadd ); + } + $("#tags").val(""); + //$(".pretext").html( ); + } + + function submitMood(){ + var toadd = $(".preview").text(); + + console.log(toadd); + } + +/*** + * update main calendar values + */ +function updateCal(url){ //updateCal("/?action=main_cal"); + mainurl = url; + cal.destroy(function(){ + cal = new CalHeatMap(); + setUpCal(); + }); +} + +/*** + * update specific day log + */ +function updateDayLog(date){ + $.ajax({ + url: "/?action=date&date="+date, + async: true, + dataType: 'html', + success: function (response) { + //console.log(response); + if(response != "0"){ + $(".previewhist").html(response); + } + } + }); +} + +/*** + * update latest tags + */ +function updateLatest(tag){ + var string = ""; + switch(tag) { + case "pos": + string = "
Latest 5 positive
"; + break; + case "neg": + string = "
Latest 5 negative
"; + break; + case "con": + string = "
Latest 5 context
"; + break; + } + $.ajax({ + url: "/?action=latest&tag="+tag, + async: true, + dataType: 'json', + success: function (response) { + if(response != "0"){ + + $.each(response, function(i, item) { + var ntag = tag.charAt(0).toUpperCase() + tag.substr(1); + string += ""+item+"
"; + }); + + //console.log(response); + $(".lat"+tag).html(string); + } + } + }); +} + +/*** + * update top tags + */ +function updateTop(tag){ + var string = ""; + switch(tag) { + case "pos": + string = "
Top 5 positive
"; + break; + case "neg": + string = "
Top 5 negative
"; + break; + case "con": + string = "
Top 5 context
"; + break; + } + $.ajax({ + url: "/?action=top&tag="+tag, + async: true, + dataType: 'json', + success: function (response) { + if(response != "0"){ + + $.each(response, function(i, item) { + //console.log(item); + var ntag = tag.charAt(0).toUpperCase() + tag.substr(1); + string += ""+item+"
"; + }); + + //console.log(response); + $(".top"+tag).html(string); + } + } + }); +} + +/*** + * update available tags + */ +function updateAvailable(){ + $.ajax({ + url: "/?action=alltag", + async: true, + dataType: 'json', + success: function (response) { + if(response != "0"){ + availableTags = response; + $( "#tags" ).autocomplete({ + source: availableTags + }); + } + } + }); +} + +/*** + * display filtered calendar + */ +function applyFilters(){ + var filttstring =""; + $(".filter").find("span").each(function() { + filttstring += $(this).html(); + }); + filttstring = filttstring.slice(8); + filttstring = filttstring.replace(/\s+/g, ''); + filttstring = filttstring.replace(/\+/g , "%2B"); + //filttstring = encodeURIComponent(filttstring); + //console.log(filttstring); + updateCal("/?action=filtered_cal&filter="+filttstring); +} + +/*** + * save to moodlog + */ +function submitMood(){ + var filttstring = []; + var sendString = ""; + $(".preview").find("span").each(function() { + filttstring.push( $(this).html() ); + }); + + filttstring.shift(); // remove date + filttstring[0] = filttstring[0].replace(/\[/g, ''); //fix no. + filttstring[0] = filttstring[0].replace(/\]/g, '|'); //fix no. + + for (var i = 0, len = filttstring.length; i < len; i++) { //tidy for URL + filttstring[i] = filttstring[i].replace(/\+/g , "%2B"); + filttstring[i] = filttstring[i].replace(/ /g , "%20"); + sendString += filttstring[i] + } + + console.log(sendString); + $.ajax({ + url: "/?action=save&log="+sendString, + async: true, + dataType: 'html', + success: function (response) { + if(response != "0"){ + + var now = new Date(); + var datestring = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2); + var fulldatestring = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2) + " " + ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2); + + $(".preview").html(""+fulldatestring+"[5]") + $("#happyval").val(5); + updateCal("/?action=main_cal"); + updateDayLog(datestring); + updateTop("pos"); + updateTop("neg"); + updateTop("con"); + updateLatest("pos"); + updateLatest("neg"); + updateLatest("con"); + } + } + }); + + +} + +/*** + * once app loaded + */ +$(document).ready(function(){ + + $('#tags').keypress(function(e){ + if(e.keyCode==13) + updatePretext(); + }); + + updateTop("pos"); + updateTop("neg"); + updateTop("con"); + updateLatest("pos"); + updateLatest("neg"); + updateLatest("con"); + + updateAvailable(); + + updateTime(); + setInterval(updateTime, 5000); // 5 * 1000 miliseconds + var interval1 = setInterval(function () { updateCal(mainurl); }, 300000); // update every 5 mins (300000) + + var interval1 = setInterval(function () { updateTop("pos"); }, 300000); + var interval1 = setInterval(function () { updateTop("neg"); }, 300000); + var interval1 = setInterval(function () { updateTop("con"); }, 300000); + var interval1 = setInterval(function () { updateLatest("pos"); }, 300000); + var interval1 = setInterval(function () { updateLatest("neg"); }, 300000); + var interval1 = setInterval(function () { updateLatest("con"); }, 300000); +}); diff --git a/README.md b/README.md index 5820176..9df3369 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,63 @@ moodlog_web =============== -PHP web application for use with moodlog.txt \ No newline at end of file +PHP web application for use with moodlog.txt + +**Installation** + +clone this into web root + +edit config.php to contain: + +1) md5 hash of login password + +2) location of you moodlog.txt + +**Screenshot** +![screenshott](http://swin.es/g/NaN/moodlog_web/raw/381e772a3ddb6e2a83e09c705d84aa52bfb06873/example.png) + +**API** + +There is a sort-of API with this, it's super basic and crappy. + +Use GET requests to /index.php + +Always include &password=[your password here] + +here are the basic functtions: + +**&action=main_cal** + +get unfiltered main cal averages - output JSON + +**&action=filtered_cal&filter=** + +get filtered main cal averages (filter=+test-test@test-test...) - output JSON + +**&action=date&date=[specific date]** + +get specific date's log - output HTML + +**&action=date_average&date=[specific date]** + +get specific date's average - output no. + +**&action=latest&tag=[pos,neg or con]** + +get latest 5 tags - output JSON + +**&action=top&tag=[pos,neg or con]** + +get top 5 tags - output JSON + +**&action=alltag** + +get all tags in popularity order - output JSON + +**&action=save&log=[your log to save]** + +save a new moodlog + +the log format should be: *no|small description+tag-tag+tag@context* + +however as simple single number will also work \ No newline at end of file diff --git a/config.php b/config.php new file mode 100755 index 0000000..f4e88b2 --- /dev/null +++ b/config.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/example.png b/example.png new file mode 100755 index 0000000..c8851f9 --- /dev/null +++ b/example.png Binary files differ diff --git a/index.php b/index.php new file mode 100755 index 0000000..fb41358 --- /dev/null +++ b/index.php @@ -0,0 +1,612 @@ +setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $ymd2 = date("Y-m-d", strtotime("$date")); +//echo $ymd2; + + $returnstring = "
$justdate
\n"; + $count = 0; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("$ymd2 -0 day"))); + + $newpos = array(); + $newneg = array(); + $newcon = array(); + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = $word; + break; + case '-': + $newneg[] = $word; + break; + case '@': + $newcon[] = $word; + break; + default: + $newstr .= " $word"; + break; + } + } + } + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + $justdate = date("Y-m-d", strtotime($datetime)); + if(strtotime($ymd2) == strtotime($justdate)){ + $count++; + $mood = $split2[0]; + $fulldate = date("Y-m-d H:i", strtotime($datetime)); + $returnstring .= "$fulldate\n[$mood]$newstr\n"; + + foreach($newpos as $pos) + $returnstring .= "$pos\n"; + foreach($newneg as $neg) + $returnstring .= "$neg\n"; + foreach($newcon as $con) + $returnstring .= "$con\n"; + $returnstring .= "
"; + } + + } + fclose($moodfile); + return ($count > 0)? $returnstring : "0"; + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function main_cal(){ + global $moodlog; + $toreturn = ""; + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + //$justdate = date("Y-m-d", strtotime($datetime)); + //$dt2 = explode("-", $datetime); + //$dtd = explode(" ", $dt2[2]); + //$dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + //$dateTime->setDate($dt2[0], $dt2[1], $dtd[0]); + //$justdate = $dateTime->format('Y-m-d'); + $dtd = explode(" ", $datetime); + $justdate = $dtd[0]; + + $newtimes[$justdate][] = $mood; + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + +//$datetime = strtotime($date); + $dt22 = explode("-", $date); + $dtd2 = explode(" ", $dt22[2]); + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setDate($dt22[0], $dt22[1], $dtd2[0]); + $justdate2 = $dateTime->getTimestamp(); + + $toreturn .= "\"$justdate2\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function filtered_cal($filter){ + global $moodlog; + $toreturn = ""; + + $pattern = '/(?=[+-@][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY; + $tags = preg_split ($pattern, $filter, $limit, $flags); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + $newtimes = array(); + while (($line = fgets($moodfile)) !== false) { + /*** + * if date < cutoff stop adding + */ + $cutoff = $date = strtotime(date("Y-m-d", strtotime("-10 month"))); + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + $mood = $split2[0]; + $justdate = date("Y-m-d", strtotime($datetime)); + + $words = explode(" ", $split2[1]); + + foreach($words as $word){ + $word = trim($word); + if (in_array($word, $tags, true)) + $newtimes[$justdate][] = $mood; + } + + } + fclose($moodfile); + foreach($newtimes as $date=>$md){ + $average = round(array_sum($md) / count($md)); + $datetime = strtotime("$date"); + $toreturn .= "\"$datetime\":$average,"; + } + + return substr($toreturn, 0, -1); + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function day_avg($ymd){ + global $moodlog; + $mood = array(); + $average = 0; + + $moodfile = @fopen($moodlog, "r"); + //$date = date("Y-m-d", $ymd); + //$date = date("Y-m-d", strtotime("$date +1 day")); + + $dateTime = new \DateTime(null, new DateTimeZone('Europe/London')); + $dateTime->setTimestamp($ymd); + $date = $dateTime->format('Y-m-d'); + $date = date("Y-m-d", strtotime("$date")); + + //$currentTime = new DateTime(); + //$currentTime = DateTime::createFromFormat( 'U', $ymd ); + //$date = $currentTime->format( 'c' ); + + $cutoff = strtotime("$date -0 day"); + + //echo $date." cutoff: ".$cutoff; + //$date = new DateTime(); + //$date->setTimestamp($ymd); + //echo $date->format('U = Y-m-d H:i:s') . "\n"; + + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + + $datetime = $split1[0]; + if(strtotime($datetime) < $cutoff) + break; + + if(strncmp($date, $datetime, 10) == 0 ) + $mood[] = $split2[0]; + } + // echo "$ymd "; + // echo $date; + // print_r($mood); + if($mood) + $average = round(array_sum($mood) / count($mood)); + return $average; + } else { + return "0"; + } +} + +function latest($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $newpos = array_unique($newpos); + $newArray = array_slice($newpos, 0, 5, false); + break; + case 'neg': + $newneg = array_unique($newneg); + $newArray = array_slice($newneg, 0, 5, false); + break; + case 'con': + $newcon = array_unique($newcon); + $newArray = array_slice($newcon, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function toptag($tag){ + global $moodlog; + $count = 0; + + + $newpos = array(); + $newneg = array(); + $newcon = array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newpos[] = trim($word); + break; + case '-': + $newneg[] = trim($word); + break; + case '@': + $newcon[] = trim($word); + break; + } + } + } + + + + } + fclose($moodfile); + switch ($tag) { + case 'pos': + $acv=array_count_values($newpos); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'neg': + $acv=array_count_values($newneg); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + case 'con': + $acv=array_count_values($newcon); + arsort($acv); + $result=array_keys($acv); + $newArray = array_slice($result, 0, 5, false); + break; + default: + return 0; + break; + } + return json_encode($newArray); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function alltag(){ + global $moodlog; + $count = 0; + + + $newtag= array(); + + $moodfile = @fopen($moodlog, "r"); + if ($moodfile) { + while (($line = fgets($moodfile)) !== false) { + + $newstr = ""; + + $split1 = explode("[", $line); + $split2 = explode("]", $split1[1]); + $words = explode(" ", $split2[1]); + foreach($words as $word){ + if($word <> ""){ + switch (mb_substr($word[0], 0, 1)) { + case '+': + $newtag[] = trim($word); + break; + case '-': + $newtag[] = trim($word); + break; + case '@': + $newtag[] = trim($word); + break; + } + } + } + } + fclose($moodfile); + + $acv=array_count_values($newtag); + arsort($acv); + $result=array_keys($acv); + + return json_encode($result); + + } else { + return "!ERROR! File: ".$moodfile." doesn't exist. !ERROR!
"; + } +} + +function new_log($log){ + global $moodlog; + $pattern = '/(?=[+-@|][a-zA-Z0-9])/'; + $limit = -1; + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; + $result = preg_split ($pattern, $log, $limit, $flags); + //print_r($result); + + $timestamp = date("Y-m-d H:i"); + $no = rtrim($result[0], "|"); + $msg = ""; + $pos = ""; + $neg = ""; + $con = ""; + + foreach($result as $item){ + switch ($item[0]) { + case '|': + $msg .= substr($item, 1)." "; + break; + case '+': + $pos .= "$item "; + break; + case '-': + $neg .= "$item "; + break; + case '@': + $con .= "$item "; + break; + } + } + $toadd = "$timestamp [$no] ".$msg.$pos.$neg.$con."\n"; + $toadd .= file_get_contents($moodlog); + file_put_contents($moodlog, $toadd); + echo "1"; +} + +?> + + + + + + + + + + + + + + + + + +
+ ""){echo $error; } ?> + + + +
+ +
+
+
Top 5 positive
+
+
+
Top 5 negative
+
+
+
Top 5 context
+
+
+
Latest 5 positive
+
+
+
Latest 5 negative
+
+
+
Latest 5 context
+
+
+ +
+
+ + + +
+
+
+ + + + + diff --git a/login.html b/login.html new file mode 100755 index 0000000..cf5481b --- /dev/null +++ b/login.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/moodlog.txt b/moodlog.txt new file mode 100755 index 0000000..4048a5c --- /dev/null +++ b/moodlog.txt @@ -0,0 +1,25 @@ +2018-09-21 19:45 [8] nearly finished webapp +code +moodlog +2018-09-21 15:20 [7] moodlog web, new challenge coins +code @personal +2018-09-21 13:30 [5] waiting for client -waiting +phishing @work +2018-09-20 17:30 [7] tricky moodlog JS +code @personal +2018-09-20 10:00 [7] tricky phishing setup +phishing +code @work +2018-09-19 12:00 [5] -ansa @work +2018-09-18 22:00 [8] +moodlog +code @personal +2018-09-18 17:00 [6] -reporting +chill @work +2018-09-17 23:30 [7] sniper elite 4 +gaming @personal +2018-09-17 12:30 [3] -onsite @bristol +2018-09-16 20:00 [8] +newpc @personal +2018-09-15 21:00 [7] -hangover +chill +adam @personal +2018-09-14 21:00 [9] +pissup +adam +james @personal +2018-09-13 07:24 [7] new computer +excited +pissup +adam +james @personal +2018-09-13 10:22 [6] write presentation -work @work +2018-09-12 09:18 [5] +code -waiting @work +2018-09-11 18:00 [4] -knackered @work +2018-09-11 09:00 [4] -ansa @work +2018-09-10 21:00 [9] mate here +gaming @personal +2018-09-10 18:00 [8] moodlog webapp +code @personal +2018-09-10 11:30 [9] pwn3d +phishing @work +2018-09-10 08:00 [6] +phishing -earlystart -support @work +2018-09-09 23:00 [9] modlog sublime-syntax finished +code @personal +2018-09-09 15:30 [8] moodlog concept +ideas @personal +2018-09-09 13:00 [7] chilled sunday +tv +chill @personal \ No newline at end of file diff --git a/script.js b/script.js new file mode 100755 index 0000000..255dcc1 --- /dev/null +++ b/script.js @@ -0,0 +1,431 @@ +/*var datas = [ + {date: "2018-09-09", value: 10}, + {date: "2018-09-08", value: 5}, + {date: "2018-09-07", value: 8}, + {date: "2018-09-07", value: 7}, + {date: "2018-09-06", value: 9}, + {date: "2018-09-05", value: 6}, + {date: "2018-09-04", value: 5}, + {date: "2018-09-03", value: 4}, + {date: "2018-09-02", value: 7}, + {date: "2018-08-02", value: 1} +] + +/* +var parser = function(data) { + var stats = {}; + console.log(data); + for (var d in data) { + console.log(data[d].date); + var dateTime = new Date(data[d].date).toISOString(); + var timestamp = Math.floor(dateTime / 1000); + let toTimestamp = strDate => Date.parse(data[d].date); + stats[timestamp] = data[d].value; + } + console.log(stats); + return stats; + +}; +*/ +/* +var stats = {}; +var parser = function(data) { + //console.log(data); + for (var d in data) { + //console.log("date:"+data[d]); + //var date = new Date(data[d].date); // Date of activity + //var sec = date.getTime()/1000; // Convert to sec + stats[d] = data[d]; + //cal.subDomainTextFormat(d, data[d]); + } + + return stats; +}; +*/ +//var mainurl = "http://localhost:8080/test.json"; +var mainurl = "/?action=main_cal"; +var cal = new CalHeatMap(); + +setUpCal(); +function setUpCal(){ + var datethen = new Date(); + datethen.setMonth(datethen.getMonth() - 9); + + cal.init({ + //data: "http://localhost:8080/index.php?action=main_cal", + data: mainurl, + dataType: "json", + //afterLoadData: parser, + start: datethen, + id : "graph", + domain : "month", // Group data by month + subDomain : "day", // Split each month by days + cellSize: 15, + cellPadding: 2, + cellRadius: 3, + domainGutter:2, + subDomainTitleFormat: { + empty: "{date}", + filled: "{count} - {date}" + }, + //itemSelector: "#cal-heatmap", + range : 10, // Just display 10 months + legend: [2,3,4,5,6,7,8,9], // Custom threshold for the scale + tooltip: false, + displayLegend: false, + label: { + position: "bottom", + align: "center", + offset: {x:0,y:-10}, + }, + considerMissingDataAsZero: true, + legendHorizontalPosition: "center", + legendColors: { + min: "#6b6de5", + max: "#46e260", + }, + subDomainTextFormat: function(date ,value) { + var origdate = ""+date; + date = origdate.split('00:00:00')[0]+'00:00:00'; + var date = parseInt((new Date(date).getTime() /1000 ).toFixed(0)) + var finval = 0; + + /*** + * All of this cos of a damn bug! + * https://github.com/wa0x6e/cal-heatmap/issues/257 + */ + $.ajax({ + url: "/?action=date_average&date="+date, + async: false, + dataType: 'html', + success: function (response) { + //console.log(response); + finval = response; + console.log("origdate: "+origdate+" date: "+date+" val:"+response); + } + }); + + if (finval == 0){finval = "";} + return finval; + }, + highlight: "now", + onClick: function(date, count) { + //alert("Oh gosh, " + count + " things occured on " + date.toISOString()); + updateDayLog(date.toISOString().slice(0, 19).replace('T', ' ')); + } + }); +} + + +function checkStats(timestamp){ + var finval = 0; + $.getJSON('test.json', function (data) { + $.each(data, function(i, field){ + //console.log(field); + if(timestamp == i){ + console.log("found: "+field); + finval = field; + } + + }); + //if (finval == 0){finval = "";} + return finval; + }); + +} + +var availableTags = [ + "-ansa", + "+phishing", + "+chill", + "@home", +]; +$( function() { + + $( "#tags" ).autocomplete({ + source: availableTags + }); +} ); + +function updateTime() { + var now = new Date(); + var datestring = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2) + " " + ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2); + $("span.date").html(datestring.toString()); +} + +$("#happyval").on("input change", function() { + $(".hpyno").html("[" + $("#happyval").val() + "]"); +}); +removespan = function(span) { + span.remove(); +} + +/*** + * filter adding and removing code + */ +var filter = 0; +function addFilterPos(word){ + filter++; + $('.filtitle').after(''+word+''); + $(".filter").show(); +} +function addFilterNeg(word){ + filter++; + $('.filtitle').after(''+word+''); + $(".filter").show(); +} +function addFilterCon(word){ + filter++; + $('.filtitle').after(''+word+''); + $(".filter").show(); +} +removefilter = function(span) { + filter--; + span.remove(); + if(filter == 0){ + $(".filter").hide(); + updateCal("/?action=main_cal"); + } +} + +/*** + * updating description + */ +function updatePretext(){ + var toadd = $("#tags").val(); + switch(toadd.charAt(0)){ + case "+": + $('.pretext').after(''+toadd+''); + break; + case "-": + $('.pretext').after(''+toadd+''); + break; + case "@": + $('.preview').append(''+toadd+''); + break; + default: + $(".pretext").html( toadd ); + } + $("#tags").val(""); + //$(".pretext").html( ); + } + + function submitMood(){ + var toadd = $(".preview").text(); + + console.log(toadd); + } + +/*** + * update main calendar values + */ +function updateCal(url){ //updateCal("/?action=main_cal"); + mainurl = url; + cal.destroy(function(){ + cal = new CalHeatMap(); + setUpCal(); + }); +} + +/*** + * update specific day log + */ +function updateDayLog(date){ + $.ajax({ + url: "/?action=date&date="+date, + async: true, + dataType: 'html', + success: function (response) { + //console.log(response); + if(response != "0"){ + $(".previewhist").html(response); + } + } + }); +} + +/*** + * update latest tags + */ +function updateLatest(tag){ + var string = ""; + switch(tag) { + case "pos": + string = "
Latest 5 positive
"; + break; + case "neg": + string = "
Latest 5 negative
"; + break; + case "con": + string = "
Latest 5 context
"; + break; + } + $.ajax({ + url: "/?action=latest&tag="+tag, + async: true, + dataType: 'json', + success: function (response) { + if(response != "0"){ + + $.each(response, function(i, item) { + var ntag = tag.charAt(0).toUpperCase() + tag.substr(1); + string += ""+item+"
"; + }); + + //console.log(response); + $(".lat"+tag).html(string); + } + } + }); +} + +/*** + * update top tags + */ +function updateTop(tag){ + var string = ""; + switch(tag) { + case "pos": + string = "
Top 5 positive
"; + break; + case "neg": + string = "
Top 5 negative
"; + break; + case "con": + string = "
Top 5 context
"; + break; + } + $.ajax({ + url: "/?action=top&tag="+tag, + async: true, + dataType: 'json', + success: function (response) { + if(response != "0"){ + + $.each(response, function(i, item) { + //console.log(item); + var ntag = tag.charAt(0).toUpperCase() + tag.substr(1); + string += ""+item+"
"; + }); + + //console.log(response); + $(".top"+tag).html(string); + } + } + }); +} + +/*** + * update available tags + */ +function updateAvailable(){ + $.ajax({ + url: "/?action=alltag", + async: true, + dataType: 'json', + success: function (response) { + if(response != "0"){ + availableTags = response; + $( "#tags" ).autocomplete({ + source: availableTags + }); + } + } + }); +} + +/*** + * display filtered calendar + */ +function applyFilters(){ + var filttstring =""; + $(".filter").find("span").each(function() { + filttstring += $(this).html(); + }); + filttstring = filttstring.slice(8); + filttstring = filttstring.replace(/\s+/g, ''); + filttstring = filttstring.replace(/\+/g , "%2B"); + //filttstring = encodeURIComponent(filttstring); + //console.log(filttstring); + updateCal("/?action=filtered_cal&filter="+filttstring); +} + +/*** + * save to moodlog + */ +function submitMood(){ + var filttstring = []; + var sendString = ""; + $(".preview").find("span").each(function() { + filttstring.push( $(this).html() ); + }); + + filttstring.shift(); // remove date + filttstring[0] = filttstring[0].replace(/\[/g, ''); //fix no. + filttstring[0] = filttstring[0].replace(/\]/g, '|'); //fix no. + + for (var i = 0, len = filttstring.length; i < len; i++) { //tidy for URL + filttstring[i] = filttstring[i].replace(/\+/g , "%2B"); + filttstring[i] = filttstring[i].replace(/ /g , "%20"); + sendString += filttstring[i] + } + + console.log(sendString); + $.ajax({ + url: "/?action=save&log="+sendString, + async: true, + dataType: 'html', + success: function (response) { + if(response != "0"){ + + var now = new Date(); + var datestring = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2); + var fulldatestring = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2) + " " + ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2); + + $(".preview").html(""+fulldatestring+"[5]") + $("#happyval").val(5); + updateCal("/?action=main_cal"); + updateDayLog(datestring); + updateTop("pos"); + updateTop("neg"); + updateTop("con"); + updateLatest("pos"); + updateLatest("neg"); + updateLatest("con"); + } + } + }); + + +} + +/*** + * once app loaded + */ +$(document).ready(function(){ + + $('#tags').keypress(function(e){ + if(e.keyCode==13) + updatePretext(); + }); + + updateTop("pos"); + updateTop("neg"); + updateTop("con"); + updateLatest("pos"); + updateLatest("neg"); + updateLatest("con"); + + updateAvailable(); + + updateTime(); + setInterval(updateTime, 5000); // 5 * 1000 miliseconds + var interval1 = setInterval(function () { updateCal(mainurl); }, 300000); // update every 5 mins (300000) + + var interval1 = setInterval(function () { updateTop("pos"); }, 300000); + var interval1 = setInterval(function () { updateTop("neg"); }, 300000); + var interval1 = setInterval(function () { updateTop("con"); }, 300000); + var interval1 = setInterval(function () { updateLatest("pos"); }, 300000); + var interval1 = setInterval(function () { updateLatest("neg"); }, 300000); + var interval1 = setInterval(function () { updateLatest("con"); }, 300000); +}); diff --git a/style.css b/style.css new file mode 100755 index 0000000..8ae59d5 --- /dev/null +++ b/style.css @@ -0,0 +1,134 @@ +body{ + background-color:#333; + font-family: 'Source Code Pro', monospace; + color:#ccc; +} + + +form{ + width:600px; + height:20px; + margin:0 auto; +} +input{ + display: inline-block; + outline: none; +} +input[type="range"]{ + -webkit-appearance:none; + width:250px; + height:10px; + margin:10px 10px; + background: linear-gradient(to right, #6b6de5 0%, #46e260 100%); + background-size:250px 2px; + background-position:center; + background-repeat:no-repeat; + overflow:hidden; + outline: none; +} + +input[type="range"]:first-of-type{ + margin-top:0px; +} + +input[type="range"]::-webkit-slider-thumb{ + -webkit-appearance:none; + width:20px; + height:20px; + background:#ddd; + position:relative; + z-index:3; + box-shadow:0 0 5px 0 rgba(0,0,0,0.3); +} + +input[type="range"]::-webkit-slider-thumb:after{ + content:" "; + width:20px; + height:10px; + position:absolute; + z-index:1; + right:20px; + top:5px; + background: #ff5b32; + background: linear-gradient(to right, #6b6de5 1%, #46e260 70%); +} +.input{ + margin-left:20px; +} +.add{ + margin-left:20px +} +.preview, .previewhist{ + font-weight:100; + font-size:0.7em; + padding-bottom: 10px; +} +.date, .datehist{color: #9f00ca; margin-right:5px;} +.hpyno, .hpyhist{color:#efe23e; margin-right:5px;} +.pretext, .pretexthist{color:#ece5e5; margin-right:5px;} +.prepos, .preposhist{ color: #58e81b; margin-right:5px;} +.preneg, .preneghist{ color: #e81b1b; margin-right:5px;} +.precon, .preconhist{ color: #999; margin-right:5px;} + +.filter{ + background-color:#555; + width:880px; + font-weight:100; + font-size:0.7em; + padding:10px; + border-radius: 2px; +} +.filtitle{font-weight:700; margin-right:5px;} +.filpos{ background-color: #58e81b; border-radius: 2px; padding:2px 5px; color:#222; margin-right:5px;} +.filneg{ background-color: #e81b1b; border-radius: 2px; padding:2px 5px; color:#222; margin-right:5px;} +.filcon{ background-color: #999; border-radius: 2px; padding:2px 5px; color:#222; margin-right:5px;} + +rect.r0 { + fill: #ededed; + fill: #000; +} +.highlight, rect.now, rect.now:hover{ + stroke: #999; +} +.graph, .graph-legend rect { + shape-rendering: auto; +} +.subdomain-text{ fill:#111; font-weight:700;} +.banner, .top10s, .fullday{ + width:950px; + color:#ccc; + text-align:left; + font-weight:700; + margin-bottom:10px; + margin-left: 50px; +} +.header{ + width:140px; + display:inline-block; + margin-right:197px; +} +.header a:link, .header a:hover, .header a:visited, .header a:active{ + text-decoration: none; + color:#ccc; +} +.fullday{ + padding-top:10px; +} +.new-log{ + width:600px; + display:inline-block; + vertical-align:top; +} +.sub-header{ + font-weight:700; + color:#ccc; +} +.toppos, .latpos, .topneg, .latneg, .topcon, .latcon{ + width:150px; + display: inline-block; + font-weight:100; + font-size:0.7em; +} +.toppos, .latpos{ color: #58e81b; vertical-align: top;} +.topneg, .latneg{ color: #e81b1b; vertical-align: top;} +.topcon, .latcon{ color: #999; vertical-align: top;}