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 megabyte int = kilobyte * 1024
const gigabyte int = megabyte * 1024 const gigabyte int = megabyte * 1024
const terabyte int = gigabyte * 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 saltLength int = 32
const sessionLength int = 80 const sessionLength int = 80
var enable_websockets bool = false // Don't change this, the value is overwritten by an initialiser 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" 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"}) totonline, totunit := convert_friendly_unit(totonline)
gridElements = append(gridElements, GridElement{"dash-gonline",strconv.Itoa(gonline) + " guests online",4,"grid_stat " + onlineGuestsColour,"","","The number of guests who are currently online"}) uonline, uunit := convert_friendly_unit(uonline)
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"}) 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"}) 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> </div>
</form> </form>
</div> </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}}"> <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> <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> <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.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}} {{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>
</div><br /> </div>
<div class="rowblock post_container" style="overflow: hidden;">{{range .ItemList}}{{if .ActionType}} <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);"> <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> <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 */ /* 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; box-sizing: border-box;
@ -280,8 +280,7 @@ hr { color: silver; border: 1px solid silver; }
{ {
padding: 0px; padding: 0px;
padding-top: 0px; padding-top: 0px;
width: 100%; margin-bottom: 16px;
margin-bottom: 8px;
overflow: hidden; overflow: hidden;
word-wrap: break-word; word-wrap: break-word;
} }

View File

@ -1,5 +1,5 @@
/* AtomBB Cosmo Port. Copyright Azareal 2017 */ /* 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; box-sizing: border-box;
@ -269,8 +269,7 @@ hr { color: silver; border: 1px solid silver; }
{ {
padding: 0px; padding: 0px;
padding-top: 0px; padding-top: 0px;
width: 100%; margin-bottom: 16px;
margin-bottom: 8px;
overflow: hidden; overflow: hidden;
word-wrap: break-word; word-wrap: break-word;
} }

View File

@ -12,7 +12,7 @@ body
background-size: cover; background-size: cover;
} }
/* Patch for Edge */ /* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) { @supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; } .user_content { font-family: Segoe UI Emoji, arial; }
} }
@ -23,27 +23,27 @@ ul
{ {
padding-left: 0px; padding-left: 0px;
padding-right: 0px; padding-right: 0px;
height: 28px; height: 36px;
list-style-type: none; list-style-type: none;
border: 1px solid #ccc; border: 1px solid #ccc;
background-color: white; background-color: white;
margin-bottom: 12px;
} }
li li
{ {
height: 26px; height: 35px;
padding-left: 10px; padding-left: 10px;
padding-top: 5px; padding-top: 8px;
padding-bottom: 5px; padding-bottom: 8px;
font-weight: bold;
text-transform: uppercase;
} }
li:hover { background: rgb(250,250,250); } li:hover { background: rgb(250,250,250); }
li a li a
{ {
text-decoration: none; text-decoration: none;
color: #515151; /*color: #515151;*/
color: black;
font-size: 17px;
} }
/*li a:hover { color: #7a7a7a; }*/
.menu_left .menu_left
{ {
float: left; float: left;
@ -58,25 +58,24 @@ li a
} }
.menu_alerts { .menu_alerts {
padding-left: 7px; /*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px; padding-top: 2px;
color: rgb(80,80,80); color: rgb(80,80,80);
} }
.menu_alerts .alert_counter { .menu_alerts .alert_counter {
position:relative; position: relative;
font-size: 9px; font-size: 8px;
top: -24px; top: -25px;
background-color: rgb(140,0,0); background-color: rgb(190,0,0);
color: white; color: white;
padding: 3px;
width: 14px; width: 14px;
left: 10px; left: 10px;
line-height: 8px; line-height: 8px;
border-radius: 20px;
padding-top: 2.5px; padding-top: 2.5px;
height: 14px; height: 14px;
opacity: 0.8;
text-align: center; text-align: center;
border: white solid 1px;
} }
.menu_alerts .alert_counter:empty { .menu_alerts .alert_counter:empty {
display: none; display: none;
@ -100,7 +99,7 @@ li a
} }
.selectedAlert .alertList { .selectedAlert .alertList {
position: absolute; position: absolute;
top: 43px; top: 51px;
display: block; display: block;
background: white; background: white;
font-size: 10px; font-size: 10px;
@ -135,6 +134,8 @@ li a
height: 30px; height: 30px;
width: 100%; width: 100%;
color: black; color: black;
font-size: 10px;
font-weight: bold;
} }
.alertItem .text.smaller { .alertItem .text.smaller {
font-size: 9px; font-size: 9px;
@ -197,7 +198,7 @@ li a
padding: 0px; padding: 0px;
padding-top: 0px; padding-top: 0px;
width: 100%; width: 100%;
margin-bottom: 8px; margin-bottom: 12px;
overflow: hidden; overflow: hidden;
word-wrap: break-word; word-wrap: break-word;
} }
@ -208,7 +209,6 @@ li a
.colstack_grid { .colstack_grid {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
/*grid-gap: 15px;*/
grid-gap: 12px; grid-gap: 12px;
margin-left: 5px; margin-left: 5px;
} }
@ -220,16 +220,12 @@ li a
overflow: hidden; overflow: hidden;
} }
.grid_stat, .grid_istat { .grid_stat, .grid_istat {
/*padding-top: 15px;*/
text-align: center; text-align: center;
/*padding-bottom: 15px;
font-size: 20px;*/
padding-top: 12px; padding-top: 12px;
padding-bottom: 12px; padding-bottom: 12px;
font-size: 16px; font-size: 16px;
} }
.grid_istat { .grid_istat {
/*margin-bottom: 10px;*/
margin-bottom: 5px; margin-bottom: 5px;
} }
@ -302,16 +298,14 @@ li a
width: 100%; width: 100%;
background-color: white; background-color: white;
} }
/* Clearfix */ /* Clearfix */
.formrow:before, .formrow:after { .formrow:before, .formrow:after {
content: " "; content: " ";
display: table; display: table;
} }
.formrow:after { clear: both; } .formrow:after { clear: both; }
.formrow:not(:last-child) .formrow:not(:last-child) { border-bottom: 1px dotted #ccc; }
{
border-bottom: 1px dotted #ccc;
}
.formitem .formitem
{ {
@ -322,18 +316,10 @@ li a
padding-bottom: 8px; padding-bottom: 8px;
font-weight: bold; font-weight: bold;
} }
.formitem:first-child .formitem:first-child { font-weight: bold; }
{ .formitem:not(:last-child) { border-right: 1px dotted #ccc; }
font-weight: bold; .formitem.invisible_border { border: none; }
}
.formitem:not(:last-child)
{
border-right: 1px dotted #ccc;
}
.formitem.invisible_border
{
border: none;
}
/* Mostly for textareas */ /* Mostly for textareas */
.formitem:only-child { width: 100%; } .formitem:only-child { width: 100%; }
.formitem textarea .formitem textarea
@ -414,10 +400,6 @@ button.username
border-width: 1px; border-width: 1px;
} }
.mention {
font-weight: bold;
}
.tag-mini .tag-mini
{ {
text-transform: none; text-transform: none;
@ -434,10 +416,8 @@ button.username
font-size: 10px; font-size: 10px;
} }
.show_on_edit .mention { font-weight: bold; }
{ .show_on_edit { display: none; }
display: none;
}
.alert .alert
{ {
@ -589,37 +569,54 @@ button.username
/* Media Queries from Simple. Probably useless in Conflux */ /* Media Queries from Simple. Probably useless in Conflux */
@media (max-width: 880px) { @media (max-width: 880px) {
li { height: 25px; font-size: 15px; padding-left: 7px; } li {
ul { height: 26px; margin-top: 8px; } height: 29px;
.menu_left { padding-right: 7px; } font-size: 15px;
.menu_right { padding-right: 7px; } 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; } body { padding-left: 4px; padding-right: 4px; margin: 0px !important; width: 100% !important; height: 100% !important; overflow-x: hidden; }
.container { width: auto; } .container { width: auto; }
.selectedAlert .alertList { top: 33px; right: 4px; } .selectedAlert .alertList { top: 37px; right: 4px; }
} }
@media (max-width: 810px) { @media (max-width: 810px) {
li
{
font-weight: normal;
text-transform: none;
}
.rowitem { text-transform: none; } .rowitem { text-transform: none; }
} }
@media (max-width: 620px) { @media (max-width: 680px) {
li li {
{
padding-left: 5px; padding-left: 5px;
padding-top: 2px; padding-top: 3px;
padding-bottom: 2px; padding-bottom: 2px;
height: 23px; height: 25px;
} }
ul { height: 24px; } li a { font-size: 14px; }
.menu_left { padding-right: 5px; } ul { height: 26px; }
.menu_right { padding-right: 5px; } .menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
.menu_create_topic { display: none; } .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; } .hide_on_mobile { display: none; }
.prev_button, .next_button { top: auto;bottom: 5px; } .prev_button, .next_button { top: auto;bottom: 5px; }
@ -628,12 +625,9 @@ button.username
} }
@media (max-width: 470px) { @media (max-width: 470px) {
.menu_overview { display: none; } .menu_overview, .menu_profile, .hide_on_micro { display: none; }
.menu_profile { display: none; } .post_container { overflow: visible !important; }
.hide_on_micro { display: none; }
.post_container {
overflow: visible !important;
}
.post_item { .post_item {
background-position: 0px 2px !important; background-position: 0px 2px !important;
background-size: 64px 64px !important; background-size: 64px 64px !important;
@ -661,9 +655,7 @@ button.username
width: 60px; width: 60px;
font-size: 15px; font-size: 15px;
} }
.userinfo { .userinfo { width: 70px; }
width: 70px;
}
.userinfo .avatar_item { .userinfo .avatar_item {
background-size: 64px; background-size: 64px;
width: 64px; width: 64px;
@ -680,3 +672,8 @@ button.username
.container { width: 100% !important; } .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; padding-bottom: 8px;
} }
/* Patch for Edge */ /* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) { @supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; } .user_content { font-family: Segoe UI Emoji, arial; }
} }
@ -19,34 +19,34 @@ ul
{ {
padding-left: 0px; padding-left: 0px;
padding-right: 0px; padding-right: 0px;
height: 28px; height: 36px;
list-style-type: none; list-style-type: none;
border: 1px solid #ccc; border: 1px solid #ccc;
background-color: white; background-color: white;
margin-bottom: 12px;
} }
li li
{ {
height: 26px; height: 35px;
padding-left: 10px; padding-left: 10px;
padding-top: 5px; padding-top: 8px;
padding-bottom: 5px; padding-bottom: 8px;
font-weight: bold;
text-transform: uppercase;
} }
li:hover { background: rgb(250,250,250); } li:hover { background: rgb(250,250,250); }
li a li a
{ {
text-decoration: none; text-decoration: none;
color: #515151; /*color: #515151;*/
color: black;
font-size: 17px;
} }
/*li a:hover { color: #7a7a7a; }*/
.menu_left .menu_left
{ {
float: left; float: left;
border-right: 1px solid #ccc; border-right: 1px solid #ccc;
padding-right: 10px; padding-right: 10px;
font-family: cursive; font-family: cursive;
padding-top: 2px; padding-top: 4px;
} }
.menu_right .menu_right
{ {
@ -56,25 +56,26 @@ li a
} }
.menu_alerts { .menu_alerts {
padding-left: 7px; /*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px; padding-top: 2px;
color: rgb(80,80,80); color: rgb(80,80,80);
} }
.menu_alerts .alert_counter { .menu_alerts .alert_counter {
position:relative; position: relative;
font-size: 9px; font-family: arial;
top: -24px; font-size: 8px;
background-color: rgb(140,0,0); top: -25px;
background-color: rgb(190,0,0);
color: white; color: white;
padding: 3px;
width: 14px; width: 14px;
left: 10px; left: 10px;
line-height: 8px; line-height: 8px;
border-radius: 20px;
padding-top: 2.5px; padding-top: 2.5px;
height: 14px; height: 14px;
opacity: 0.8;
text-align: center; text-align: center;
border: white solid 1px;
} }
.menu_alerts .alert_counter:empty { .menu_alerts .alert_counter:empty {
display: none; display: none;
@ -94,7 +95,7 @@ li a
} }
.selectedAlert .alertList { .selectedAlert .alertList {
position: absolute; position: absolute;
top: 43px; top: 51px;
display: block; display: block;
background: white; background: white;
font-size: 10px; font-size: 10px;
@ -128,6 +129,10 @@ li a
width: calc(100% - 20px); width: calc(100% - 20px);
height: 30px; height: 30px;
} }
.alertItem .text {
font-size: 10px;
font-weight: bold;
}
.container .container
{ {
@ -186,7 +191,7 @@ li a
padding: 0px; padding: 0px;
padding-top: 0px; padding-top: 0px;
width: 100%; width: 100%;
margin-bottom: 8px; margin-bottom: 12px;
overflow: hidden; overflow: hidden;
word-wrap: break-word; word-wrap: break-word;
} }
@ -233,7 +238,7 @@ li a
width: 100%; width: 100%;
padding-left: 8px; padding-left: 8px;
padding-right: 8px; padding-right: 8px;
padding-top: 17px; padding-top: 12px;
padding-bottom: 12px; padding-bottom: 12px;
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
@ -254,6 +259,7 @@ li a
color: black; color: black;
} }
.rowitem a:hover { color: silver; } .rowitem a:hover { color: silver; }
.top_post { margin-bottom: 16px; }
.opthead { display: none; } .opthead { display: none; }
.col_left .col_left
@ -484,17 +490,31 @@ button.username
.next_button { right: 14px; } .next_button { right: 14px; }
@media (max-width: 880px) { @media (max-width: 880px) {
li { height: 25px; font-size: 15px; padding-left: 7px; } li {
ul { height: 26px; margin-top: 8px; } height: 29px;
.menu_left { padding-right: 7px; } font-size: 15px;
.menu_right { padding-right: 7px; } 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; } body { padding-left: 4px; padding-right: 4px; margin: 0px !important; width: 100% !important; height: 100% !important; overflow-x: hidden; }
.container { width: auto; } .container { width: auto; }
.selectedAlert .alertList { top: 33px; right: 4px; } .selectedAlert .alertList { top: 37px; right: 4px; }
} }
@media (max-width: 810px) { @media (max-width: 810px) {
li { font-weight: normal; text-transform: none; }
.rowitem { text-transform: none; } .rowitem { text-transform: none; }
/*.rowhead { font-family: arial; } /*.rowhead { font-family: arial; }
.menu_left { font-family: arial; }*/ .menu_left { font-family: arial; }*/
@ -502,19 +522,30 @@ button.username
.level { font-size: 17px; } .level { font-size: 17px; }
} }
@media (max-width: 620px) { @media (max-width: 700px) {
li li {
{
padding-left: 5px; padding-left: 5px;
padding-top: 2px; padding-top: 3px;
padding-bottom: 2px; padding-bottom: 2px;
height: 23px; height: 25px;
} }
ul { height: 24px; } li a { font-size: 14px; }
.menu_left { padding-right: 5px; } ul { height: 26px; }
.menu_left { padding-right: 5px; padding-top: 1px; }
.menu_right { padding-right: 5px; } .menu_right { padding-right: 5px; }
.menu_create_topic { display: none;} .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; } .hide_on_mobile { display: none; }
.prev_button, .next_button { top: auto; bottom: 5px; } .prev_button, .next_button { top: auto; bottom: 5px; }
@ -562,3 +593,9 @@ button.username
} }
.container { width: 100% !important; } .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; padding-bottom: 8px;
} }
/* Patch for Edge */ /* Patch for Edge, until they fix emojis in arial x.x */
@supports (-ms-ime-align:auto) { @supports (-ms-ime-align:auto) {
.user_content { font-family: Segoe UI Emoji, arial; } .user_content { font-family: Segoe UI Emoji, arial; }
} }
@ -21,27 +21,27 @@ ul
{ {
padding-left: 0px; padding-left: 0px;
padding-right: 0px; padding-right: 0px;
height: 28px; height: 36px;
list-style-type: none; list-style-type: none;
border: 1px solid #ccc; border: 1px solid #ccc;
background-color: white; background-color: white;
margin-bottom: 12px;
} }
li li
{ {
height: 26px; height: 35px;
padding-left: 10px; padding-left: 10px;
padding-top: 5px; padding-top: 8px;
padding-bottom: 5px; padding-bottom: 8px;
font-weight: bold;
text-transform: uppercase;
} }
li:hover { background: rgb(250,250,250); } li:hover { background: rgb(250,250,250); }
li a li a
{ {
text-decoration: none; text-decoration: none;
color: #515151; /*color: #515151;*/
color: black;
font-size: 17px;
} }
/*li a:hover { color: #7a7a7a; }*/
.menu_left .menu_left
{ {
float: left; float: left;
@ -56,25 +56,24 @@ li a
} }
.menu_alerts { .menu_alerts {
padding-left: 7px; /*padding-left: 7px;*/
font-size: 20px;
padding-top: 2px; padding-top: 2px;
color: rgb(80,80,80); color: rgb(80,80,80);
} }
.menu_alerts .alert_counter { .menu_alerts .alert_counter {
position:relative; position: relative;
font-size: 9px; font-size: 8px;
top: -24px; top: -25px;
background-color: rgb(140,0,0); background-color: rgb(190,0,0);
color: white; color: white;
padding: 3px;
width: 14px; width: 14px;
left: 10px; left: 10px;
line-height: 8px; line-height: 8px;
border-radius: 20px;
padding-top: 2.5px; padding-top: 2.5px;
height: 14px; height: 14px;
opacity: 0.8;
text-align: center; text-align: center;
border: white solid 1px;
} }
.menu_alerts .alert_counter:empty { .menu_alerts .alert_counter:empty {
display: none; display: none;
@ -94,7 +93,7 @@ li a
} }
.selectedAlert .alertList { .selectedAlert .alertList {
position: absolute; position: absolute;
top: 43px; top: 51px;
display: block; display: block;
background: white; background: white;
font-size: 10px; font-size: 10px;
@ -128,6 +127,10 @@ li a
width: calc(100% - 20px); width: calc(100% - 20px);
height: 30px; height: 30px;
} }
.alertItem .text {
font-size: 10px;
font-weight: bold;
}
.container .container
{ {
@ -186,7 +189,7 @@ li a
padding: 0px; padding: 0px;
padding-top: 0px; padding-top: 0px;
width: 100%; width: 100%;
margin-bottom: 8px; margin-bottom: 12px;
overflow: hidden; overflow: hidden;
word-wrap: break-word; word-wrap: break-word;
} }
@ -253,6 +256,7 @@ li a
color: black; color: black;
} }
.rowitem a:hover { color: silver; } .rowitem a:hover { color: silver; }
.top_post { margin-bottom: 12px; }
.opthead { display: none; } .opthead { display: none; }
.col_left .col_left
@ -274,16 +278,8 @@ li a
font-weight: bold; font-weight: bold;
text-transform: uppercase; text-transform: uppercase;
} }
.colitem.passive .colitem.passive { font-weight: normal; text-transform: none; }
{ .colitem a { text-decoration: none; color: black; }
font-weight: normal;
text-transform: none;
}
.colitem a
{
text-decoration: none;
color: black;
}
.colitem a:hover { color: silver; } .colitem a:hover { color: silver; }
.formrow .formrow
@ -298,11 +294,7 @@ li a
display: table; display: table;
} }
.formrow:after { clear: both; } .formrow:after { clear: both; }
.formrow:not(:last-child) { border-bottom: 1px dotted #ccc; }
.formrow:not(:last-child)
{
border-bottom: 1px dotted #ccc;
}
.formitem .formitem
{ {
@ -368,11 +360,7 @@ button
border-width: 1px; border-width: 1px;
font-size: 15px; font-size: 15px;
} }
button.username button.username { position: relative; top: -0.25px; }
{
position: relative;
top: -0.25px;
}
.username.level { color: #303030; } .username.level { color: #303030; }
.username.real_username { color: #404040; font-size: 17px; } .username.real_username { color: #404040; font-size: 17px; }
.username.real_username:hover { color: black; } .username.real_username:hover { color: black; }
@ -480,33 +468,61 @@ button.username
.next_button { right: 14px; } .next_button { right: 14px; }
@media (max-width: 880px) { @media (max-width: 880px) {
li { height: 25px; font-size: 15px; padding-left: 7px; } li {
ul { height: 26px; margin-top: 8px; } height: 29px;
.menu_left { padding-right: 7px; } font-size: 15px;
.menu_right { padding-right: 7px; } padding-left: 9px;
body { padding-left: 4px; padding-right: 4px; margin: 0px !important; width: 100% !important; height: 100% !important; overflow-x: hidden; } 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; } .container { width: auto; }
.selectedAlert .alertList { top: 33px; right: 4px; } .selectedAlert .alertList { top: 37px; right: 4px; }
} }
@media (max-width: 810px) { @media (max-width: 810px) {
li { font-weight: normal; text-transform: none; }
.rowitem { text-transform: none; } .rowitem { text-transform: none; }
} }
@media (max-width: 620px) { @media (max-width: 680px) {
li li {
{
padding-left: 5px; padding-left: 5px;
padding-top: 2px; padding-top: 3px;
padding-bottom: 2px; padding-bottom: 2px;
height: 23px; height: 25px;
} }
ul { height: 24px; } li a { font-size: 14px; }
.menu_left { padding-right: 5px; } ul { height: 26px; }
.menu_right { padding-right: 5px; } .menu_left { padding-right: 7px; }
.menu_right { padding-right: 7px; }
.menu_create_topic { display: none;} .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; } .hide_on_mobile { display: none !important; }
.prev_button, .next_button { top: auto; bottom: 5px; } .prev_button, .next_button { top: auto; bottom: 5px; }
@ -515,12 +531,9 @@ button.username
} }
@media (max-width: 470px) { @media (max-width: 470px) {
.menu_overview { display: none; } .menu_overview, .menu_profile { display: none; }
.menu_profile { display: none; }
.hide_on_micro { display: none !important; } .hide_on_micro { display: none !important; }
.post_container { .post_container { overflow: visible !important; }
overflow: visible !important;
}
.post_item { .post_item {
background-position: 0px 2px !important; background-position: 0px 2px !important;
background-size: 64px 64px !important; background-size: 64px 64px !important;
@ -551,3 +564,8 @@ button.username
} }
.container { width: 100% !important; } .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 package main
import "fmt" import (
import "time" "fmt"
import "os" "time"
import "math" "os"
import "strings" "math"
import "unicode" "strings"
import "strconv" "unicode"
import "encoding/base64" "strconv"
import "crypto/rand" "encoding/base64"
import "net/smtp" "crypto/rand"
"net/smtp"
)
type Version struct type Version struct
{ {
@ -60,36 +62,23 @@ func relative_time(in string) (string, error) {
case months > 11: case months > 11:
//return t.Format("Mon Jan 2 2006"), err //return t.Format("Mon Jan 2 2006"), err
return t.Format("Jan 2 2006"), err return t.Format("Jan 2 2006"), err
case months > 1: case months > 1: return fmt.Sprintf("%d months ago", months), err
return fmt.Sprintf("%d months ago", months), err case months == 1: return "a month ago", err
case months == 1: case weeks > 1: return fmt.Sprintf("%d weeks ago", weeks), err
return "a month ago", err case int(hours / 24) == 7: return "a week ago", err
case weeks > 1: case int(hours / 24) == 1: return "1 day ago", err
return fmt.Sprintf("%d weeks ago", weeks), err case int(hours / 24) > 1: return fmt.Sprintf("%d days ago", int(hours / 24)), err
case int(hours / 24) == 7: case seconds <= 1: return "a moment ago", err
return "a week ago", err case seconds < 60: return fmt.Sprintf("%d seconds ago", int(seconds)), err
case int(hours / 24) == 1: case seconds < 120: return "a minute ago", err
return "1 day ago", err case seconds < 3600: return fmt.Sprintf("%d minutes ago", int(seconds / 60)), err
case int(hours / 24) > 1: case seconds < 7200: return "an hour ago", err
return fmt.Sprintf("%d days ago", int(hours / 24)), err default: return fmt.Sprintf("%d hours ago", int(seconds / 60 / 60)), 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) { func convert_byte_unit(bytes float64) (float64,string) {
switch switch {
{
case bytes >= float64(terabyte): return bytes / float64(terabyte), "TB" case bytes >= float64(terabyte): return bytes / float64(terabyte), "TB"
case bytes >= float64(gigabyte): return bytes / float64(gigabyte), "GB" case bytes >= float64(gigabyte): return bytes / float64(gigabyte), "GB"
case bytes >= float64(megabyte): return bytes / float64(megabyte), "MB" 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 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) { 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? // 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 { 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)) { switch(string(page)) {
case "/panel/": case "/panel/":
//fmt.Println("/panel/ WS Route") //fmt.Println("/panel/ WS Route")
w, err := ws_user.conn.NextWriter(websocket.TextMessage) /*w, err := ws_user.conn.NextWriter(websocket.TextMessage)
if err != nil { if err != nil {
//fmt.Println(err.Error()) //fmt.Println(err.Error())
return 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-totonline " + strconv.Itoa(totonline) + " online\r"))
w.Write([]byte("set #dash-gonline " + strconv.Itoa(gonline) + " guests 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-uonline " + strconv.Itoa(uonline) + " users online\r"))
w.Close() w.Close()*/
// Listen for changes and inform the admins... // Listen for changes and inform the admins...
admin_stats_mutex.Lock() admin_stats_mutex.Lock()
@ -176,12 +176,15 @@ func admin_stats_ticker() {
var last_cpu_perc int = -1 var last_cpu_perc int = -1
var last_available_ram int64 = -1 var last_available_ram int64 = -1
var no_stat_updates bool = false var no_stat_updates bool = false
var no_ram_updates bool = false
var onlineColour, onlineGuestsColour, onlineUsersColour, cpustr, cpuColour, ramstr, ramColour string var onlineColour, onlineGuestsColour, onlineUsersColour, cpustr, cpuColour, ramstr, ramColour string
var cpuerr, ramerr error var cpuerr, ramerr error
var memres *mem.VirtualMemoryStat var memres *mem.VirtualMemoryStat
var cpu_perc []float64 var cpu_perc []float64
var totunit, uunit, gunit string
AdminStatLoop: AdminStatLoop:
for { for {
//fmt.Println("tick tock") //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... // 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) 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) time.Sleep(time.Second)
continue continue
} }
@ -229,6 +233,10 @@ AdminStatLoop:
} else { } else {
onlineUsersColour = "stat_red" onlineUsersColour = "stat_red"
} }
totonline, totunit = convert_friendly_unit(totonline)
uonline, uunit = convert_friendly_unit(uonline)
gonline, gunit = convert_friendly_unit(gonline)
} }
if cpuerr != nil { if cpuerr != nil {
@ -245,33 +253,35 @@ AdminStatLoop:
} }
} }
if ramerr != nil { if !no_ram_updates {
ramstr = "Unknown" if ramerr != nil {
} else { ramstr = "Unknown"
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 { } else {
totstr = fmt.Sprintf("%.1f",total_count) total_count, total_unit := convert_byte_unit(float64(memres.Total))
} used_count := convert_byte_in_unit(float64(memres.Total - memres.Available),total_unit)
if used_count > total_count { // Round totals with .9s up, it's how most people see it anyway. Floats are notoriously imprecise, so do it off 0.85
used_count = total_count var totstr string
} if (total_count - float64(int(total_count))) > 0.85 {
ramstr = fmt.Sprintf("%.1f",used_count) + " / " + totstr + total_unit used_count += 1.0 - (total_count - float64(int(total_count)))
totstr = strconv.Itoa(int(total_count) + 1)
} else {
totstr = fmt.Sprintf("%.1f",total_count)
}
ramperc := ((memres.Total - memres.Available) * 100) / memres.Total if used_count > total_count {
if ramperc < 50 { used_count = total_count
ramColour = "stat_green" }
} else if ramperc < 75 { ramstr = fmt.Sprintf("%.1f",used_count) + " / " + totstr + total_unit
ramColour = "stat_orange"
} else { ramperc := ((memres.Total - memres.Available) * 100) / memres.Total
ramColour = "stat_red" 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 { if !no_stat_updates {
w.Write([]byte("set #dash-totonline " + strconv.Itoa(totonline) + " online\r")) w.Write([]byte("set #dash-totonline " + strconv.Itoa(totonline) + totunit + " online\r"))
w.Write([]byte("set #dash-gonline " + strconv.Itoa(gonline) + " guests online\r")) w.Write([]byte("set #dash-gonline " + strconv.Itoa(gonline) + gunit + " guests online\r"))
w.Write([]byte("set #dash-uonline " + strconv.Itoa(uonline) + " users 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-totonline grid_item grid_stat " + onlineColour + "\r"))
w.Write([]byte("set-class #dash-gonline grid_stat " + onlineGuestsColour + "\r")) w.Write([]byte("set-class #dash-gonline grid_item grid_stat " + onlineGuestsColour + "\r"))
w.Write([]byte("set-class #dash-uonline grid_stat " + onlineUsersColour + "\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 #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")) if !no_ram_updates {
w.Write([]byte("set-class #dash-ram grid_istat " + ramColour + "\r")) w.Write([]byte("set #dash-ram RAM: " + ramstr + "\r"))
w.Write([]byte("set-class #dash-ram grid_item grid_istat " + ramColour + "\r"))
}
w.Close() w.Close()
} }