Revamped the top navbar.

Really large numbers are now formatted properly on the Control Panel Dashboard.
This commit is contained in:
Azareal 2017-05-12 14:25:12 +01:00
parent 3b5f48b5a2
commit b841acef29
11 changed files with 338 additions and 259 deletions

1
last_version.txt Normal file
View File

@ -0,0 +1 @@
0.1.0-dev

View File

@ -25,6 +25,9 @@ const kilobyte int = 1024
const megabyte int = kilobyte * 1024
const gigabyte int = megabyte * 1024
const terabyte int = gigabyte * 1024
//const thousand int = 1000
//const million int = 1_000_000
//const billion int = 1_000_000_000
const saltLength int = 32
const sessionLength int = 80
var enable_websockets bool = false // Don't change this, the value is overwritten by an initialiser

View File

@ -168,9 +168,13 @@ func route_panel(w http.ResponseWriter, r *http.Request){
onlineUsersColour = "stat_red"
}
gridElements = append(gridElements, GridElement{"dash-totonline",strconv.Itoa(totonline) + " online",3,"grid_stat " + onlineColour,"","","The number of people who are currently online"})
gridElements = append(gridElements, GridElement{"dash-gonline",strconv.Itoa(gonline) + " guests online",4,"grid_stat " + onlineGuestsColour,"","","The number of guests who are currently online"})
gridElements = append(gridElements, GridElement{"dash-uonline",strconv.Itoa(uonline) + " users online",5,"grid_stat " + onlineUsersColour,"","","The number of logged-in users who are currently online"})
totonline, totunit := convert_friendly_unit(totonline)
uonline, uunit := convert_friendly_unit(uonline)
gonline, gunit := convert_friendly_unit(gonline)
gridElements = append(gridElements, GridElement{"dash-totonline",strconv.Itoa(totonline) + totunit + " online",3,"grid_stat " + onlineColour,"","","The number of people who are currently online"})
gridElements = append(gridElements, GridElement{"dash-gonline",strconv.Itoa(gonline) + gunit + " guests online",4,"grid_stat " + onlineGuestsColour,"","","The number of guests who are currently online"})
gridElements = append(gridElements, GridElement{"dash-uonline",strconv.Itoa(uonline) + uunit + " users online",5,"grid_stat " + onlineUsersColour,"","","The number of logged-in users who are currently online"})
}
gridElements = append(gridElements, GridElement{"dash-postsperday",strconv.Itoa(postCount) + " posts / " + postInterval,6,"grid_stat " + postColour,"","","The number of new posts over the last 24 hours"})

View File

@ -18,7 +18,7 @@
</div>
</form>
</div>
<div class="rowblock post_container">
<div class="rowblock post_container top_post">
<div class="rowitem passive editable_parent post_item" style="border-bottom: none;{{if .Topic.Avatar}}background-image:url({{.Topic.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le .Topic.ContentLines 5}}-1{{end}}0px;background-repeat:no-repeat, repeat-y;background-size:128px;padding-left:136px;{{.Topic.Css}}{{end}}">
<p class="hide_on_edit topic_content user_content" style="margin:0;padding:0;">{{.Topic.Content}}</p>
<textarea name="topic_content" class="show_on_edit topic_content_input">{{.Topic.Content}}</textarea>
@ -31,7 +31,7 @@
{{if .Topic.LikeCount}}<a class="username hide_on_micro" style="float: right;color:#505050;border-left:none;padding-left:5px;padding-right:5px;font-size:17px;">{{.Topic.LikeCount}}</a><a class="username hide_on_micro" style="color:#505050;float:right;opacity:0.85;margin-left:5px;" title="Like Count">😀</a>{{end}}
{{if .Topic.Tag}}<a class="username hide_on_micro" style="float:right;color:#505050;font-size:16px;">{{.Topic.Tag}}</a>{{else}}<a class="username hide_on_micro level">{{.Topic.Level}}</a><a class="username hide_on_micro" style="color:#505050;float:right;opacity:0.85;" title="Level">👑</a>{{end}}
</div>
</div><br />
</div>
<div class="rowblock post_container" style="overflow: hidden;">{{range .ItemList}}{{if .ActionType}}
<div class="rowitem passive deletable_block editable_parent post_item" style="padding:14px;text-align:center;background-color:rgb(255,245,245);">
<span class="action_icon" style="font-size: 18px;padding-right: 5px;">{{.ActionIcon}}</span>

View File

@ -1,5 +1,5 @@
/* AtomBB Cosmo Port. Copyright Azareal 2017 - 2018 */
/* I'm currently converting the CSS over. Don't use this yet! */
/* I'm currently converting the CSS over from one of my previous projects. Don't use this yet! */
* {
box-sizing: border-box;
@ -280,8 +280,7 @@ hr { color: silver; border: 1px solid silver; }
{
padding: 0px;
padding-top: 0px;
width: 100%;
margin-bottom: 8px;
margin-bottom: 16px;
overflow: hidden;
word-wrap: break-word;
}

View File

@ -1,5 +1,5 @@
/* AtomBB Cosmo Port. Copyright Azareal 2017 */
/* I'm currently converting the CSS over. Don't use this yet! */
/* I'm currently converting the CSS over from one of my previous projects. Don't use this yet! */
* {
box-sizing: border-box;
@ -269,8 +269,7 @@ hr { color: silver; border: 1px solid silver; }
{
padding: 0px;
padding-top: 0px;
width: 100%;
margin-bottom: 8px;
margin-bottom: 16px;
overflow: hidden;
word-wrap: break-word;
}

View File

@ -12,7 +12,7 @@ body
background-size: cover;
}
/* Patch for Edge */
/* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; }
}
@ -23,27 +23,27 @@ ul
{
padding-left: 0px;
padding-right: 0px;
height: 28px;
height: 36px;
list-style-type: none;
border: 1px solid #ccc;
background-color: white;
margin-bottom: 12px;
}
li
{
height: 26px;
height: 35px;
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
text-transform: uppercase;
padding-top: 8px;
padding-bottom: 8px;
}
li:hover { background: rgb(250,250,250); }
li a
{
text-decoration: none;
color: #515151;
/*color: #515151;*/
color: black;
font-size: 17px;
}
/*li a:hover { color: #7a7a7a; }*/
.menu_left
{
float: left;
@ -58,25 +58,24 @@ li a
}
.menu_alerts {
padding-left: 7px;
/*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px;
color: rgb(80,80,80);
}
.menu_alerts .alert_counter {
position:relative;
font-size: 9px;
top: -24px;
background-color: rgb(140,0,0);
position: relative;
font-size: 8px;
top: -25px;
background-color: rgb(190,0,0);
color: white;
padding: 3px;
width: 14px;
left: 10px;
line-height: 8px;
border-radius: 20px;
padding-top: 2.5px;
height: 14px;
opacity: 0.8;
text-align: center;
border: white solid 1px;
}
.menu_alerts .alert_counter:empty {
display: none;
@ -100,7 +99,7 @@ li a
}
.selectedAlert .alertList {
position: absolute;
top: 43px;
top: 51px;
display: block;
background: white;
font-size: 10px;
@ -135,6 +134,8 @@ li a
height: 30px;
width: 100%;
color: black;
font-size: 10px;
font-weight: bold;
}
.alertItem .text.smaller {
font-size: 9px;
@ -197,7 +198,7 @@ li a
padding: 0px;
padding-top: 0px;
width: 100%;
margin-bottom: 8px;
margin-bottom: 12px;
overflow: hidden;
word-wrap: break-word;
}
@ -208,7 +209,6 @@ li a
.colstack_grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
/*grid-gap: 15px;*/
grid-gap: 12px;
margin-left: 5px;
}
@ -220,16 +220,12 @@ li a
overflow: hidden;
}
.grid_stat, .grid_istat {
/*padding-top: 15px;*/
text-align: center;
/*padding-bottom: 15px;
font-size: 20px;*/
padding-top: 12px;
padding-bottom: 12px;
font-size: 16px;
}
.grid_istat {
/*margin-bottom: 10px;*/
margin-bottom: 5px;
}
@ -302,16 +298,14 @@ li a
width: 100%;
background-color: white;
}
/* Clearfix */
.formrow:before, .formrow:after {
content: " ";
display: table;
}
.formrow:after { clear: both; }
.formrow:not(:last-child)
{
border-bottom: 1px dotted #ccc;
}
.formrow:not(:last-child) { border-bottom: 1px dotted #ccc; }
.formitem
{
@ -322,18 +316,10 @@ li a
padding-bottom: 8px;
font-weight: bold;
}
.formitem:first-child
{
font-weight: bold;
}
.formitem:not(:last-child)
{
border-right: 1px dotted #ccc;
}
.formitem.invisible_border
{
border: none;
}
.formitem:first-child { font-weight: bold; }
.formitem:not(:last-child) { border-right: 1px dotted #ccc; }
.formitem.invisible_border { border: none; }
/* Mostly for textareas */
.formitem:only-child { width: 100%; }
.formitem textarea
@ -414,10 +400,6 @@ button.username
border-width: 1px;
}
.mention {
font-weight: bold;
}
.tag-mini
{
text-transform: none;
@ -434,10 +416,8 @@ button.username
font-size: 10px;
}
.show_on_edit
{
display: none;
}
.mention { font-weight: bold; }
.show_on_edit { display: none; }
.alert
{
@ -589,37 +569,54 @@ button.username
/* Media Queries from Simple. Probably useless in Conflux */
@media (max-width: 880px) {
li { height: 25px; font-size: 15px; padding-left: 7px; }
ul { height: 26px; margin-top: 8px; }
.menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
li {
height: 29px;
font-size: 15px;
padding-left: 9px;
padding-top: 6px;
padding-bottom: 6px;
}
ul {
height: 30px;
margin-top: 8px;
}
.menu_left { padding-right: 9px; }
.menu_right { padding-right: 9px; }
.menu_alerts {
padding-left: 7px;
padding-right: 7px;
font-size: 18px;
}
body { padding-left: 4px; padding-right: 4px; margin: 0px !important; width: 100% !important; height: 100% !important; overflow-x: hidden; }
.container { width: auto; }
.selectedAlert .alertList { top: 33px; right: 4px; }
.selectedAlert .alertList { top: 37px; right: 4px; }
}
@media (max-width: 810px) {
li
{
font-weight: normal;
text-transform: none;
}
.rowitem { text-transform: none; }
}
@media (max-width: 620px) {
li
{
@media (max-width: 680px) {
li {
padding-left: 5px;
padding-top: 2px;
padding-top: 3px;
padding-bottom: 2px;
height: 23px;
height: 25px;
}
ul { height: 24px; }
.menu_left { padding-right: 5px; }
.menu_right { padding-right: 5px; }
li a { font-size: 14px; }
ul { height: 26px; }
.menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
.menu_create_topic { display: none; }
.menu_alerts { padding-left: 4px; padding-right: 4px; }
.menu_alerts {
padding-left: 4px;
padding-right: 4px;
font-size: 16px;
padding-top: 1px;
}
.selectedAlert .alertList { top: 33px; }
.hide_on_mobile { display: none; }
.prev_button, .next_button { top: auto;bottom: 5px; }
@ -628,12 +625,9 @@ button.username
}
@media (max-width: 470px) {
.menu_overview { display: none; }
.menu_profile { display: none; }
.hide_on_micro { display: none; }
.post_container {
overflow: visible !important;
}
.menu_overview, .menu_profile, .hide_on_micro { display: none; }
.post_container { overflow: visible !important; }
.post_item {
background-position: 0px 2px !important;
background-size: 64px 64px !important;
@ -661,9 +655,7 @@ button.username
width: 60px;
font-size: 15px;
}
.userinfo {
width: 70px;
}
.userinfo { width: 70px; }
.userinfo .avatar_item {
background-size: 64px;
width: 64px;
@ -679,4 +671,9 @@ button.username
.post_tag { font-size: 12px; }
.container { width: 100% !important; }
}
}
@media (max-width: 330px) {
li { padding-left: 6px; }
.menu_left { padding-right: 6px; }
}

View File

@ -10,7 +10,7 @@ body
padding-bottom: 8px;
}
/* Patch for Edge */
/* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; }
}
@ -19,34 +19,34 @@ ul
{
padding-left: 0px;
padding-right: 0px;
height: 28px;
height: 36px;
list-style-type: none;
border: 1px solid #ccc;
background-color: white;
margin-bottom: 12px;
}
li
{
height: 26px;
height: 35px;
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
text-transform: uppercase;
padding-top: 8px;
padding-bottom: 8px;
}
li:hover { background: rgb(250,250,250); }
li a
{
text-decoration: none;
color: #515151;
/*color: #515151;*/
color: black;
font-size: 17px;
}
/*li a:hover { color: #7a7a7a; }*/
.menu_left
{
float: left;
border-right: 1px solid #ccc;
padding-right: 10px;
font-family: cursive;
padding-top: 2px;
padding-top: 4px;
}
.menu_right
{
@ -56,25 +56,26 @@ li a
}
.menu_alerts {
padding-left: 7px;
/*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px;
color: rgb(80,80,80);
}
.menu_alerts .alert_counter {
position:relative;
font-size: 9px;
top: -24px;
background-color: rgb(140,0,0);
position: relative;
font-family: arial;
font-size: 8px;
top: -25px;
background-color: rgb(190,0,0);
color: white;
padding: 3px;
width: 14px;
left: 10px;
line-height: 8px;
border-radius: 20px;
padding-top: 2.5px;
height: 14px;
opacity: 0.8;
text-align: center;
border: white solid 1px;
}
.menu_alerts .alert_counter:empty {
display: none;
@ -94,7 +95,7 @@ li a
}
.selectedAlert .alertList {
position: absolute;
top: 43px;
top: 51px;
display: block;
background: white;
font-size: 10px;
@ -128,6 +129,10 @@ li a
width: calc(100% - 20px);
height: 30px;
}
.alertItem .text {
font-size: 10px;
font-weight: bold;
}
.container
{
@ -186,7 +191,7 @@ li a
padding: 0px;
padding-top: 0px;
width: 100%;
margin-bottom: 8px;
margin-bottom: 12px;
overflow: hidden;
word-wrap: break-word;
}
@ -233,7 +238,7 @@ li a
width: 100%;
padding-left: 8px;
padding-right: 8px;
padding-top: 17px;
padding-top: 12px;
padding-bottom: 12px;
font-weight: bold;
text-transform: uppercase;
@ -254,6 +259,7 @@ li a
color: black;
}
.rowitem a:hover { color: silver; }
.top_post { margin-bottom: 16px; }
.opthead { display: none; }
.col_left
@ -484,17 +490,31 @@ button.username
.next_button { right: 14px; }
@media (max-width: 880px) {
li { height: 25px; font-size: 15px; padding-left: 7px; }
ul { height: 26px; margin-top: 8px; }
.menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
li {
height: 29px;
font-size: 15px;
padding-left: 9px;
padding-top: 2px;
padding-bottom: 6px;
}
ul {
height: 30px;
margin-top: 8px;
}
.menu_left { padding-right: 9px; padding-top: 2px; }
.menu_right { padding-right: 9px; }
.menu_alerts {
padding-left: 7px;
padding-right: 7px;
font-size: 18px;
}
body { padding-left: 4px; padding-right: 4px; margin: 0px !important; width: 100% !important; height: 100% !important; overflow-x: hidden; }
.container { width: auto; }
.selectedAlert .alertList { top: 33px; right: 4px; }
.selectedAlert .alertList { top: 37px; right: 4px; }
}
@media (max-width: 810px) {
li { font-weight: normal; text-transform: none; }
.rowitem { text-transform: none; }
/*.rowhead { font-family: arial; }
.menu_left { font-family: arial; }*/
@ -502,19 +522,30 @@ button.username
.level { font-size: 17px; }
}
@media (max-width: 620px) {
li
{
@media (max-width: 700px) {
li {
padding-left: 5px;
padding-top: 2px;
padding-top: 3px;
padding-bottom: 2px;
height: 23px;
height: 25px;
}
ul { height: 24px; }
.menu_left { padding-right: 5px; }
li a { font-size: 14px; }
ul { height: 26px; }
.menu_left { padding-right: 5px; padding-top: 1px; }
.menu_right { padding-right: 5px; }
.menu_create_topic { display: none;}
.menu_alerts { padding-left: 4px; padding-right: 4px; }
.menu_alerts {
padding-left: 4px;
padding-right: 4px;
font-size: 16px;
padding-top: 1px;
}
.menu_alerts .alert_counter {
top: -23px;
left: 8px;
}
.selectedAlert .alertList { top: 33px; }
.hide_on_mobile { display: none; }
.prev_button, .next_button { top: auto; bottom: 5px; }
@ -561,4 +592,10 @@ button.username
text-align: center;
}
.container { width: 100% !important; }
}
}
@media (max-width: 330px) {
li { padding-left: 6px; }
.menu_left { padding-right: 6px; }
.menu_alerts { border-left: none; }
}

View File

@ -10,7 +10,7 @@ body
padding-bottom: 8px;
}
/* Patch for Edge */
/* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; }
}
@ -21,27 +21,27 @@ ul
{
padding-left: 0px;
padding-right: 0px;
height: 28px;
height: 36px;
list-style-type: none;
border: 1px solid #ccc;
background-color: white;
margin-bottom: 12px;
}
li
{
height: 26px;
height: 35px;
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
font-weight: bold;
text-transform: uppercase;
padding-top: 8px;
padding-bottom: 8px;
}
li:hover { background: rgb(250,250,250); }
li a
{
text-decoration: none;
color: #515151;
/*color: #515151;*/
color: black;
font-size: 17px;
}
/*li a:hover { color: #7a7a7a; }*/
.menu_left
{
float: left;
@ -56,25 +56,24 @@ li a
}
.menu_alerts {
padding-left: 7px;
/*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px;
color: rgb(80,80,80);
}
.menu_alerts .alert_counter {
position:relative;
font-size: 9px;
top: -24px;
background-color: rgb(140,0,0);
position: relative;
font-size: 8px;
top: -25px;
background-color: rgb(190,0,0);
color: white;
padding: 3px;
width: 14px;
left: 10px;
line-height: 8px;
border-radius: 20px;
padding-top: 2.5px;
height: 14px;
opacity: 0.8;
text-align: center;
border: white solid 1px;
}
.menu_alerts .alert_counter:empty {
display: none;
@ -94,7 +93,7 @@ li a
}
.selectedAlert .alertList {
position: absolute;
top: 43px;
top: 51px;
display: block;
background: white;
font-size: 10px;
@ -128,6 +127,10 @@ li a
width: calc(100% - 20px);
height: 30px;
}
.alertItem .text {
font-size: 10px;
font-weight: bold;
}
.container
{
@ -186,7 +189,7 @@ li a
padding: 0px;
padding-top: 0px;
width: 100%;
margin-bottom: 8px;
margin-bottom: 12px;
overflow: hidden;
word-wrap: break-word;
}
@ -253,6 +256,7 @@ li a
color: black;
}
.rowitem a:hover { color: silver; }
.top_post { margin-bottom: 12px; }
.opthead { display: none; }
.col_left
@ -274,16 +278,8 @@ li a
font-weight: bold;
text-transform: uppercase;
}
.colitem.passive
{
font-weight: normal;
text-transform: none;
}
.colitem a
{
text-decoration: none;
color: black;
}
.colitem.passive { font-weight: normal; text-transform: none; }
.colitem a { text-decoration: none; color: black; }
.colitem a:hover { color: silver; }
.formrow
@ -298,11 +294,7 @@ li a
display: table;
}
.formrow:after { clear: both; }
.formrow:not(:last-child)
{
border-bottom: 1px dotted #ccc;
}
.formrow:not(:last-child) { border-bottom: 1px dotted #ccc; }
.formitem
{
@ -368,11 +360,7 @@ button
border-width: 1px;
font-size: 15px;
}
button.username
{
position: relative;
top: -0.25px;
}
button.username { position: relative; top: -0.25px; }
.username.level { color: #303030; }
.username.real_username { color: #404040; font-size: 17px; }
.username.real_username:hover { color: black; }
@ -480,33 +468,61 @@ button.username
.next_button { right: 14px; }
@media (max-width: 880px) {
li { height: 25px; font-size: 15px; padding-left: 7px; }
ul { height: 26px; margin-top: 8px; }
.menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
body { padding-left: 4px; padding-right: 4px; margin: 0px !important; width: 100% !important; height: 100% !important; overflow-x: hidden; }
li {
height: 29px;
font-size: 15px;
padding-left: 9px;
padding-top: 6px;
padding-bottom: 6px;
}
ul {
height: 30px;
margin-top: 8px;
}
.menu_left { padding-right: 9px; }
.menu_right { padding-right: 9px; }
.menu_alerts {
padding-left: 7px;
padding-right: 7px;
font-size: 18px;
}
body {
padding-left: 4px;
padding-right: 4px;
margin: 0px !important;
width: 100% !important;
height: 100% !important;
overflow-x: hidden;
}
.container { width: auto; }
.selectedAlert .alertList { top: 33px; right: 4px; }
.selectedAlert .alertList { top: 37px; right: 4px; }
}
@media (max-width: 810px) {
li { font-weight: normal; text-transform: none; }
.rowitem { text-transform: none; }
}
@media (max-width: 620px) {
li
{
@media (max-width: 680px) {
li {
padding-left: 5px;
padding-top: 2px;
padding-top: 3px;
padding-bottom: 2px;
height: 23px;
height: 25px;
}
ul { height: 24px; }
.menu_left { padding-right: 5px; }
.menu_right { padding-right: 5px; }
li a { font-size: 14px; }
ul { height: 26px; }
.menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
.menu_create_topic { display: none;}
.menu_alerts { padding-left: 4px; padding-right: 4px; }
.menu_alerts {
padding-left: 4px;
padding-right: 4px;
font-size: 16px;
padding-top: 1px;
}
.selectedAlert .alertList { top: 33px; }
.hide_on_mobile { display: none !important; }
.prev_button, .next_button { top: auto; bottom: 5px; }
@ -515,12 +531,9 @@ button.username
}
@media (max-width: 470px) {
.menu_overview { display: none; }
.menu_profile { display: none; }
.menu_overview, .menu_profile { display: none; }
.hide_on_micro { display: none !important; }
.post_container {
overflow: visible !important;
}
.post_container { overflow: visible !important; }
.post_item {
background-position: 0px 2px !important;
background-size: 64px 64px !important;
@ -550,4 +563,9 @@ button.username
text-align: center;
}
.container { width: 100% !important; }
}
}
@media (max-width: 330px) {
li { padding-left: 6px; }
.menu_left { padding-right: 6px; }
}

View File

@ -1,15 +1,17 @@
package main
import "fmt"
import "time"
import "os"
import "math"
import "strings"
import "unicode"
import "strconv"
import "encoding/base64"
import "crypto/rand"
import "net/smtp"
import (
"fmt"
"time"
"os"
"math"
"strings"
"unicode"
"strconv"
"encoding/base64"
"crypto/rand"
"net/smtp"
)
type Version struct
{
@ -60,36 +62,23 @@ func relative_time(in string) (string, error) {
case months > 11:
//return t.Format("Mon Jan 2 2006"), err
return t.Format("Jan 2 2006"), err
case months > 1:
return fmt.Sprintf("%d months ago", months), err
case months == 1:
return "a month ago", err
case weeks > 1:
return fmt.Sprintf("%d weeks ago", weeks), err
case int(hours / 24) == 7:
return "a week ago", err
case int(hours / 24) == 1:
return "1 day ago", err
case int(hours / 24) > 1:
return fmt.Sprintf("%d days ago", int(hours / 24)), err
case seconds <= 1:
return "a moment ago", err
case seconds < 60:
return fmt.Sprintf("%d seconds ago", int(seconds)), err
case seconds < 120:
return "a minute ago", err
case seconds < 3600:
return fmt.Sprintf("%d minutes ago", int(seconds / 60)), err
case seconds < 7200:
return "an hour ago", err
default:
return fmt.Sprintf("%d hours ago", int(seconds / 60 / 60)), err
case months > 1: return fmt.Sprintf("%d months ago", months), err
case months == 1: return "a month ago", err
case weeks > 1: return fmt.Sprintf("%d weeks ago", weeks), err
case int(hours / 24) == 7: return "a week ago", err
case int(hours / 24) == 1: return "1 day ago", err
case int(hours / 24) > 1: return fmt.Sprintf("%d days ago", int(hours / 24)), err
case seconds <= 1: return "a moment ago", err
case seconds < 60: return fmt.Sprintf("%d seconds ago", int(seconds)), err
case seconds < 120: return "a minute ago", err
case seconds < 3600: return fmt.Sprintf("%d minutes ago", int(seconds / 60)), err
case seconds < 7200: return "an hour ago", err
default: return fmt.Sprintf("%d hours ago", int(seconds / 60 / 60)), err
}
}
func convert_byte_unit(bytes float64) (float64,string) {
switch
{
switch {
case bytes >= float64(terabyte): return bytes / float64(terabyte), "TB"
case bytes >= float64(gigabyte): return bytes / float64(gigabyte), "GB"
case bytes >= float64(megabyte): return bytes / float64(megabyte), "MB"
@ -113,6 +102,26 @@ func convert_byte_in_unit(bytes float64,unit string) (count float64) {
return
}
func convert_unit(num int) (int,string) {
switch {
case num >= 1000000000000: return 0, "∞"
case num >= 1000000000: return num / 1000000000, "B"
case num >= 1000000: return num / 1000000, "M"
case num >= 1000: return num / 1000, "K"
default: return num, ""
}
}
func convert_friendly_unit(num int) (int,string) {
switch {
case num >= 1000000000000: return 0, " zillion"
case num >= 1000000000: return num / 1000000000, " billion"
case num >= 1000000: return num / 1000000, " million"
case num >= 1000: return num / 1000, " thousand"
default: return num, ""
}
}
func SendEmail(email string, subject string, msg string) (res bool) {
// This hook is useful for plugin_sendmail or for testing tools. Possibly to hook it into some sort of mail server?
if vhooks["email_send_intercept"] != nil {

View File

@ -129,7 +129,7 @@ func ws_page_responses(ws_user *WS_User, page []byte) {
switch(string(page)) {
case "/panel/":
//fmt.Println("/panel/ WS Route")
w, err := ws_user.conn.NextWriter(websocket.TextMessage)
/*w, err := ws_user.conn.NextWriter(websocket.TextMessage)
if err != nil {
//fmt.Println(err.Error())
return
@ -143,7 +143,7 @@ func ws_page_responses(ws_user *WS_User, page []byte) {
w.Write([]byte("set #dash-totonline " + strconv.Itoa(totonline) + " online\r"))
w.Write([]byte("set #dash-gonline " + strconv.Itoa(gonline) + " guests online\r"))
w.Write([]byte("set #dash-uonline " + strconv.Itoa(uonline) + " users online\r"))
w.Close()
w.Close()*/
// Listen for changes and inform the admins...
admin_stats_mutex.Lock()
@ -176,12 +176,15 @@ func admin_stats_ticker() {
var last_cpu_perc int = -1
var last_available_ram int64 = -1
var no_stat_updates bool = false
var no_ram_updates bool = false
var onlineColour, onlineGuestsColour, onlineUsersColour, cpustr, cpuColour, ramstr, ramColour string
var cpuerr, ramerr error
var memres *mem.VirtualMemoryStat
var cpu_perc []float64
var totunit, uunit, gunit string
AdminStatLoop:
for {
//fmt.Println("tick tock")
@ -200,7 +203,8 @@ AdminStatLoop:
// It's far more likely that the CPU Usage will change than the other stats, so we'll optimise them seperately...
no_stat_updates = (uonline == last_uonline && gonline == last_gonline && totonline == last_totonline)
if no_stat_updates && int(cpu_perc[0]) == last_cpu_perc && last_available_ram == int64(memres.Available) {
no_ram_updates = (last_available_ram == int64(memres.Available))
if int(cpu_perc[0]) == last_cpu_perc && no_stat_updates && no_ram_updates {
time.Sleep(time.Second)
continue
}
@ -229,6 +233,10 @@ AdminStatLoop:
} else {
onlineUsersColour = "stat_red"
}
totonline, totunit = convert_friendly_unit(totonline)
uonline, uunit = convert_friendly_unit(uonline)
gonline, gunit = convert_friendly_unit(gonline)
}
if cpuerr != nil {
@ -245,33 +253,35 @@ AdminStatLoop:
}
}
if ramerr != nil {
ramstr = "Unknown"
} else {
total_count, total_unit := convert_byte_unit(float64(memres.Total))
used_count := convert_byte_in_unit(float64(memres.Total - memres.Available),total_unit)
// Round totals with .9s up, it's how most people see it anyway. Floats are notoriously imprecise, so do it off 0.85
var totstr string
if (total_count - float64(int(total_count))) > 0.85 {
used_count += 1.0 - (total_count - float64(int(total_count)))
totstr = strconv.Itoa(int(total_count) + 1)
if !no_ram_updates {
if ramerr != nil {
ramstr = "Unknown"
} else {
totstr = fmt.Sprintf("%.1f",total_count)
}
if used_count > total_count {
used_count = total_count
}
ramstr = fmt.Sprintf("%.1f",used_count) + " / " + totstr + total_unit
ramperc := ((memres.Total - memres.Available) * 100) / memres.Total
if ramperc < 50 {
ramColour = "stat_green"
} else if ramperc < 75 {
ramColour = "stat_orange"
} else {
ramColour = "stat_red"
total_count, total_unit := convert_byte_unit(float64(memres.Total))
used_count := convert_byte_in_unit(float64(memres.Total - memres.Available),total_unit)
// Round totals with .9s up, it's how most people see it anyway. Floats are notoriously imprecise, so do it off 0.85
var totstr string
if (total_count - float64(int(total_count))) > 0.85 {
used_count += 1.0 - (total_count - float64(int(total_count)))
totstr = strconv.Itoa(int(total_count) + 1)
} else {
totstr = fmt.Sprintf("%.1f",total_count)
}
if used_count > total_count {
used_count = total_count
}
ramstr = fmt.Sprintf("%.1f",used_count) + " / " + totstr + total_unit
ramperc := ((memres.Total - memres.Available) * 100) / memres.Total
if ramperc < 50 {
ramColour = "stat_green"
} else if ramperc < 75 {
ramColour = "stat_orange"
} else {
ramColour = "stat_red"
}
}
}
@ -290,20 +300,22 @@ AdminStatLoop:
}
if !no_stat_updates {
w.Write([]byte("set #dash-totonline " + strconv.Itoa(totonline) + " online\r"))
w.Write([]byte("set #dash-gonline " + strconv.Itoa(gonline) + " guests online\r"))
w.Write([]byte("set #dash-uonline " + strconv.Itoa(uonline) + " users online\r"))
w.Write([]byte("set #dash-totonline " + strconv.Itoa(totonline) + totunit + " online\r"))
w.Write([]byte("set #dash-gonline " + strconv.Itoa(gonline) + gunit + " guests online\r"))
w.Write([]byte("set #dash-uonline " + strconv.Itoa(uonline) + uunit + " users online\r"))
w.Write([]byte("set-class #dash-totonline grid_stat " + onlineColour + "\r"))
w.Write([]byte("set-class #dash-gonline grid_stat " + onlineGuestsColour + "\r"))
w.Write([]byte("set-class #dash-uonline grid_stat " + onlineUsersColour + "\r"))
w.Write([]byte("set-class #dash-totonline grid_item grid_stat " + onlineColour + "\r"))
w.Write([]byte("set-class #dash-gonline grid_item grid_stat " + onlineGuestsColour + "\r"))
w.Write([]byte("set-class #dash-uonline grid_item grid_stat " + onlineUsersColour + "\r"))
}
w.Write([]byte("set #dash-cpu CPU: " + cpustr + "%\r"))
w.Write([]byte("set-class #dash-cpu grid_istat " + cpuColour + "\r"))
w.Write([]byte("set-class #dash-cpu grid_item grid_istat " + cpuColour + "\r"))
w.Write([]byte("set #dash-ram RAM: " + ramstr + "\r"))
w.Write([]byte("set-class #dash-ram grid_istat " + ramColour + "\r"))
if !no_ram_updates {
w.Write([]byte("set #dash-ram RAM: " + ramstr + "\r"))
w.Write([]byte("set-class #dash-ram grid_item grid_istat " + ramColour + "\r"))
}
w.Close()
}