a TON of bugfixes and new features

This commit is contained in:
jomo
2014-04-28 03:01:33 +02:00
parent a6ba503e73
commit 65f5adf65d
59 changed files with 1023 additions and 970 deletions

View File

@@ -6,7 +6,6 @@ gem 'mysql2'
gem 'jquery-rails'
gem 'therubyracer'
gem 'bcrypt-ruby' # To use ActiveModel's has_secure_password
gem 'simple_form'
gem 'sanitize'
gem 'redcarpet'
gem 'hirb' #pretty console output

View File

@@ -112,9 +112,6 @@ GEM
sass (~> 3.2.0)
sprockets (~> 2.8, <= 2.11.0)
sprockets-rails (~> 2.0)
simple_form (3.0.2)
actionpack (~> 4.0)
activemodel (~> 4.0)
sprockets (2.11.0)
hike (~> 1.2)
multi_json (~> 1.0)
@@ -160,7 +157,6 @@ DEPENDENCIES
rest-client
sanitize
sass-rails
simple_form
therubyracer
uglifier
webrick

View File

@@ -0,0 +1,12 @@
<svg viewBox="0 0 16 17" height="20px" width="20px" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path
d="m9.27 6.283c-0.63 0.46-1.511 0.691-2.641 0.691h-0.521c-0.45 0-0.736-0.359-0.635-0.797l0.628-2.72c0.101-0.438 0.552-0.797 1.002-0.797h0.686c0.802 0 1.408 0.136 1.814 0.409 0.409 0.268 0.611 0.683 0.611 1.244 0 0.852-0.315 1.507-0.944 1.97zm3.369-5.42c-0.913-0.566-2.16-0.863-4.288-0.863h-4.372c-0.449 0-0.9 0.359-1.001 0.797l-2.957 12.813c-0.101 0.439 0.185 0.798 0.634 0.798h2.099c0.45 0 0.901-0.358 1.003-0.797l0.717-3.105c0.101-0.438 0.552-0.797 1.001-0.797h0.598c2.562 0 4.554-0.524 5.979-1.575 1.427-1.051 2.139-2.433 2.139-4.148-0.001-1.365-0.439-2.425-1.552-3.123z"
fill="#fff"
/>
<!-- original color: #00457c -->
<path
d="m15.603 3.917c-0.264-0.505-0.651-0.917-1.155-1.231-0.025-0.016-0.055-0.029-0.081-0.044 0.004 0.007 0.009 0.014 0.013 0.021 0.265 0.506 0.396 1.135 0.396 1.891 0 1.715-0.712 3.097-2.138 4.148-1.425 1.052-3.418 1.574-5.979 1.574h-0.597c-0.45 0-0.9 0.359-1.001 0.798l-0.719 3.106c-0.101 0.438-0.552 0.797-1.002 0.797h-1.404l-0.105 0.457c-0.101 0.438 0.184 0.798 0.633 0.798h2.1c0.45 0 0.9-0.359 1.001-0.798l0.718-3.106c0.101-0.438 0.551-0.797 1.002-0.797h0.597c2.562 0 4.554-0.522 5.979-1.574 1.426-1.052 2.139-2.434 2.139-4.149 0-0.755-0.132-1.385-0.397-1.891z"
fill="#fff"
/>
<!-- original color: #0079c1 -->
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 B

After

Width:  |  Height:  |  Size: 317 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 195 B

View File

@@ -1,7 +1,6 @@
/*
*= require_self
*= require style.css
*= require screen.css
*= require mobi.css
*= require highlight/tomorrow-night.css
*/

View File

@@ -2,14 +2,23 @@
@media only screen
and (max-width: 999px)
{
#mobile-info {
background: none repeat scroll 0 0 #AB0000;
color: #FFFFFF;
background: none repeat scroll 0 0 #ab0000;
color: #fff;
text-align: center;
display: block;
font-size: 0.7em;
}
th, td {
// force tables into line-mode
// it's a bit ugly, but probably the best
// solution for small screens
display: block;
}
#head {
text-align: left;
}
@@ -24,4 +33,21 @@ and (max-width: 999px)
margin-right: 0;
}
.item-group {
margin: 30px 0;
&.with-avatar {
margin-left: 0;
.avatar {
float: none;
margin: 0;
border: none;
height: 32px;
width: 32px;
vertical-align: middle;
}
}
}
}

View File

@@ -1,614 +0,0 @@
@keyframes wiggle {
0% {transform: rotate(-3deg);}
100% {transform: rotate(3deg);}
}
@-webkit-keyframes wiggle {
0% {transform: rotate(-3deg);}
100% {transform: rotate(3deg);}
}
@media only screen
and (min-width: 0px) //TODO
{
*, *:before, *:after, *:hover, *:active, *:focus {
-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
outline: none !important;
}
*::-moz-focus-inner {
border: 0;
outline: none !important;
}
html {
overflow-y: scroll;
padding: 0 !important;
margin: 0 !important;
}
body {
background-color: #F2F2F2;
color: #3F3F3F;
padding: 0 !important;
margin: 0 !important;
}
#mobile-info {
display: none;
}
a {
color: #AB0000;
text-decoration: none;
&:hover {
color: #F00;
}
}
.flash {
text-align: center;
padding: 10px;
font-weight: bold;
cursor: pointer;
&#notice {
background: #8e8;
border-bottom: 3px dashed #8d8;
}
&#alert {
background: #ebb;
border-bottom: 3px dashed #fdd;
}
}
#head {
#menu {
background: #3F3F3F;
height: 50px;
border-bottom: 1px solid #363636;
position: relative;
#logo {
width: 100px;
height: 100px;
position: absolute;
background: url(image_path('logo.png')) no-repeat;
background-position: 0 -100px;
left: 85px;
&:hover {
transition: all 0.3s ease 0s;
background-position: 0 0;
}
}
ul {
margin: 0 0 0 185px;
padding: 0;
list-style: none;
line-height: 0;
a {
display: inline-block;
color: #fff;
&:hover {
color: #f66;
}
}
li {
margin: 15px 10px;
font-size: 20px;
line-height: 1em;
}
}
}
#userbar {
border-bottom: 1px solid #d1d1d1;
height: 50px;
line-height: 50px;
text-align: right;
display: inline-block;
width: 100%;
background: #eaeaea;
#userinfo {
display: inline-block;
margin-right: 10px;
text-shadow: 0 1px 1px #fff;
a {
color: #3F3F3F;
&:hover {
color: #f00;
}
}
img.avatar {
border: 1px solid #000;
border-radius: 16px;
vertical-align: middle;
height: 32px;
width: 32px;
&:hover {
box-shadow: 0 0 2px;
}
}
#userinfo-box {
display: inline-block;
text-align: right;
vertical-align: middle;
line-height: 1em;
}
}
}
}
img.user-avatar {
border: 1px solid #000;
border-radius: 4px;
height: 128px;
width: 128px;
}
img.avatar {
image-rendering: optimizeSpeed;
image-rendering:-moz-crisp-edges;
image-rendering:-o-crisp-edges;
image-rendering: optimize-contrast;
image-rendering: -webkit-optimize-contrast;
-ms-interpolation-mode: nearest-neighbor;
}
span.no-about {
color: #888;
font-style: italic;
}
#main-content {
padding: 30px 100px;
width: 100%;
margin: auto;
h1 {
font-weight: normal;
font-size: 200%;
margin: 0;
text-shadow: 0 1px #999;
}
}
#user-info {
.user-avatar {
margin-bottom: 30px;
}
}
.user-avatar {
display: block;
}
.post, .thread {
margin-bottom: 50px;
.post-content, .thread-content {
margin-top: 10px;
clear: both;
word-wrap: break-word;
overflow: hidden;
img {
max-width: 100%;
}
}
.post-title, .thread-title {
margin-bottom: 10px;
word-wrap: break-word;
h1 {
text-transform: capitalize;
}
h2 {
font-weight: normal;
text-transform: capitalize;
display: inline;
font-size: 200%;
}
.comment-counter {
float: right;
}
}
table {
tr, td, th {
border-collapse: collapse;
border: 1px solid #aaa;
}
tbody {
tr:nth-child(odd) {
background: #FFF;
}
tr:nth-child(even) {
background: #DDD
}
}
td, th {
padding: 0.3em 1em;
}
thead {
background: #3F3F3F;
color: #fff;
}
}
}
pre {
border-radius: 2px;
position: relative;
background: #3F3F3F;
&:after {
color: #fff;
content: attr(lang); // show language on top right
font-style: italic;
margin: 10px;
position: absolute;
right: -10px;
top: 0;
opacity: 0;
transition: all 0.3s;
cursor: default;
}
&:hover:after {
opacity: 1;
right: 0;
}
code {
padding: 0;
box-shadow: 0 0 16px #222 inset;
background: #3F3F3F !important;
border: none;
border-radius: 3px;
}
}
code {
background: #A2A2A2;
padding: 2px 5px;
border-radius: 3px;
color: #000;
border: 1px solid #888;
display: inline-block;
line-height: 1em;
}
table, tr, td, th {
border-collapse: collapse;
}
blockquote {
background: #F9F9F9;
border-left: 3px solid #3F3F3F;
display: inline-block;
margin: 0;
padding: 2px 5px 2px 2px;
}
blockquote p {
display: inline;
}
.user {
display: inline-block;
a.role {
display: inline-block;
color: #fff !important;
font-weight: bold;
padding: 0 0.5em;
border-radius: 3px;
&.superadmin, &.admin {
background: #d22 !important;
}
&.mod {
background: #6af !important;
}
&.normal {
background: #aaa !important;
}
&.banned, &.disabled {
background: #ccc !important;
text-decoration: line-through !important;
color: #888 !important;
}
&:hover {
color: #ddd !important;
}
}
.donor {
background: #f60 !important;
border-radius: 3px;
color: #fff !important;
font-weight: bold !important;
margin-left: 3px;
padding: 0 0.5em;
display: inline-block;
}
.ign {
display: block;
color: #000;
font-style: italic;
}
}
#comments {
margin: 50px 0 0 40px;
}
#markdown-note {
margin: 0;
}
select {
text-indent: 0.01px;
text-overflow: "";
}
input , select, textarea {
margin: 4px;
vertical-align: middle;
&[type=submit] {
margin: 0;
}
option {
padding: 0.5em;
&:hover {
background: #0f0;
color: #00f;
}
&:nth-child(even) {
background: #eee;
}
&:nth-child(odd) {
background: #ccc;
}
}
}
input[type=text], input[type=email], input[type=password], input[type=number], textarea, select {
background: #ddd;
border: none;
height: 3em;
margin: 4px 0 0 0;
padding: 0.5em 1em;
width: 100%;
}
input, select, textarea {
&.disabled, &[disabled] {
box-shadow: none;
background: #ddd;
}
}
textarea {
max-width: 100% !important;
height: 200px;
padding: 1em;
min-height: 3.5em;
&.comment {
height: 75px;
}
&.full-width {
width: 100%;
}
&.vertical {
resize: vertical;
}
&.horizontal {
resize: horizontal;
}
}
tr.special_edit {
background: #faa;
font-style: italic;
font-weight: bold;
box-shadow: 0 0 5px #faa;
}
.field_with_errors {
input, select, textarea {
border: 1px solid #f00;
box-shadow: 0 0 5px #faa inset;
border-bottom: none;
}
.validation-error, .error {
display: inline-block;
padding: 0 1em;
width: 100%;
background: #faa;
font-weight: bold;
border: 1px solid #f00;
border-top: none;
}
}
#form_labels {
text-align: right;
float: left;
label {
display: block;
padding: 0.5em;
}
}
#form_inputs {
input, select, textarea {
width: 400px;
}
}
.profile-action {
float: right;
}
.user-unconfirmed, .user-banned {
background: #AB0000;
color: white;
font-weight: bold;
padding: 4px 10px;
display: inline-block;
border-radius: 3px;
margin: 10px 0;
}
.btn {
margin: 1px 1px 0 0;
padding: 6px;
cursor: default;
color: #fff;
border: none;
font-size: 12px;
line-height: normal;
display: inline-block;
&[disabled], &[disabled]:hover {
box-shadow: 0 0 5px #ddd inset;
color: #ddd;
}
&.blue {
background: #4096ee;
&[disabled] {
background: #96C1EE;
}
}
&.red {
background: #ee4040;
&[disabled] {
background: #EE8383;
}
}
&.left {
float: left;
}
&.right {
float: right;
}
&:hover {
box-shadow: 0 0 5px #095fb7 inset;
color: #fff;
}
}
#userlist {
.list-user {
margin: 15px 0;
a img {
vertical-align: middle;
border: 1px solid;
border-radius: 3px;
color: #222;
&:hover {
color: #AB0000;
}
}
.detail {
display: inline-block;
vertical-align: middle;
margin-left: 3px;
}
}
}
.editlink {
float: right;
opacity: 0;
margin-right: -10px;
transition: opacity 0.3s, margin 0.3s;
}
#blogpost_text {
width: 100%;
}
.clear {
clear: both;
display: block;
visibility: hidden;
}
.item-group {
margin: 30px 0;
&.with-avatar {
margin-left: 70px;
.avatar {
float: left;
margin-left: -70px;
border: 1px solid #ccc;
border-radius: 5px;
}
}
&:hover .editlink {
opacity: 1;
margin-right: 0;
}
.header {
background: #3F3F3F;
border-radius: 5px 5px 0 0;
padding: 0.5em;
border-bottom: 1px solid #ccc;
color: #fff;
text-shadow: 0 1px 1px #222;
a {
color: #fff;
&:hover {
color: #f66;
}
}
}
.items {
border: 1px solid #ddd;
border-top: none;
border-bottom: none;
.item {
display: block;
padding: 0.5em;
border-bottom: 1px solid #ddd;
&.locked:before {
content: "(locked) ";
color: #000;
}
&.sticky:before {
content: "(sticky) ";
color: #000;
}
&.lockedsticky:before {
content: "(locked sticky) ";
color: #000;
}
&.content {
.headline {
margin: 0;
border-bottom: 1px solid #ddd;
}
}
}
}
}
.bold {
font-weight: bold;
}
iframe.youtube {
border: none;
width: 640px;
max-width: 100%;
height: 360px;
}
mark {
background: #faa;
padding: 0 2px;
border-radius: 3px;
}
.comment-counter {
float: right;
}
.red-alert {
color: #AB0000;
font-weight: bold;
}
img {
max-width: 100%;
}
}

View File

@@ -1,11 +1,722 @@
@keyframes wiggle {
0% {transform: rotate(-3deg);}
100% {transform: rotate(3deg);}
}
@-webkit-keyframes wiggle {
0% {transform: rotate(-3deg);}
100% {transform: rotate(3deg);}
}
@keyframes target {
0% {background-color: #ff8;}
}
@-webkit-keyframes target {
0% {background-color: #ff8;}
}
*, *:before, *:after, *:hover, *:active, *:focus {
-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
outline: none !important;
}
/* Global CSS for all screen sizes */
*::-moz-focus-inner {
border: 0;
outline: none !important;
}
html {
overflow-y: scroll;
padding: 0 !important;
margin: 0 !important;
}
body {
margin: 0;
padding: 0;
background-color: #f2f2f2;
color: #3f3f3f;
padding: 0 !important;
margin: 0 !important;
font: 14px/1.6 'Oswald','Calibri','Arial','DejaVu Sans', 'Open Sans','Lucida Sans','Lucida Grande','Lucida Sans Unicode',sans-serif;
}
::selection {
color: #fff;
background: #363636;
}
::-moz-selection {
color: #fff;
background: #363636;
}
#mobile-info {
display: none;
}
a {
color: #ab0000;
text-decoration: none;
&:hover {
color: #f00;
}
}
.flash {
text-align: center;
padding: 10px;
font-weight: bold;
cursor: pointer;
&.notice {
background: #8e8;
border-bottom: 3px dashed #8d8;
}
&.alert {
background: #ebb;
border-bottom: 3px dashed #fdd;
}
}
#head {
#menu {
background: #3f3f3f;
height: 50px;
border-bottom: 1px solid #363636;
position: relative;
#logo {
width: 100px;
height: 100px;
position: absolute;
background: url(image_path('logo.png')) no-repeat;
background-position: 0 -100px;
left: 85px;
&:hover {
transition: all 0.3s ease 0;
background-position: 0 0;
}
}
ul {
margin: 0 0 0 185px;
padding: 0;
list-style: none;
line-height: 0;
a {
display: inline-block;
color: #fff;
&:hover {
color: #f66;
}
}
li {
margin: 15px 10px;
font-size: 20px;
line-height: 1em;
}
}
}
#userbar {
border-bottom: 1px solid #d1d1d1;
height: 50px;
line-height: 50px;
text-align: right;
display: inline-block;
width: 100%;
background: #eaeaea;
#userinfo {
display: inline-block;
margin-right: 10px;
text-shadow: 0 1px 1px #fff;
a {
color: #3f3f3f;
&:hover {
color: #f00;
}
}
img.avatar {
border: 1px solid #000;
border-radius: 16px;
vertical-align: middle;
height: 32px;
width: 32px;
&:hover {
box-shadow: 0 0 2px;
}
}
#userinfo-box {
display: inline-block;
text-align: right;
vertical-align: middle;
line-height: 1em;
}
}
}
}
img.user-avatar {
border: 1px solid #000;
border-radius: 4px;
height: 128px;
width: 128px;
}
img.avatar {
image-rendering: -moz-crisp-edges;
image-rendering: -o-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: crisp-edges;
-ms-interpolation-mode: nearest-neighbor;
}
span.no-about {
color: #888;
font-style: italic;
}
#main-content {
padding: 30px 100px;
width: 1600px;
max-width: 100%;
margin: auto;
border-bottom: 1px solid #ddd;
box-shadow: 0 10px 10px #ddd;
h1 {
font-weight: normal;
font-size: 200%;
margin: 0;
text-shadow: 0 1px #999;
word-wrap: break-word;
}
}
#user-info {
.user-avatar {
margin-bottom: 30px;
}
}
.user-avatar {
display: block;
}
.post, .thread, .thread-reply {
margin-bottom: 50px;
.post-content, .thread-content {
margin-top: 10px;
clear: both;
word-wrap: break-word;
overflow: hidden;
img {
max-width: 100%;
}
}
.post-title, .thread-title {
margin-bottom: 10px;
word-wrap: break-word;
h1 {
text-transform: capitalize;
}
h2 {
font-weight: normal;
text-transform: capitalize;
display: inline;
font-size: 200%;
}
.comment-counter {
float: right;
}
}
table {
tr, td, th {
border-collapse: collapse;
border: 1px solid #aaa;
}
tbody {
tr:nth-child(odd) {
background: #fff;
}
tr:nth-child(even) {
background: #ddd;
}
}
td, th {
padding: 0.3em 1em;
}
thead {
background: #3f3f3f;
color: #fff;
}
}
}
pre {
border-radius: 2px;
position: relative;
background: #3f3f3f;
&:after {
color: #fff;
content: attr(lang); // show language on top right
font-style: italic;
margin: 10px;
position: absolute;
right: -10px;
top: 0;
opacity: 0;
transition: all 0.3s;
cursor: default;
}
&:hover:after {
opacity: 1;
right: 0;
}
// code blocks
code {
padding: 0;
box-shadow: 0 0 16px #222 inset;
background: #3f3f3f !important;
border: none;
border-radius: 3px;
}
}
// inline code
code {
background: #ddd;
padding: 2px;
border-radius: 3px;
color: #000;
border: 1px solid #aaa;
display: inline-block;
line-height: 1em;
}
table, tr, td, th {
border-collapse: collapse;
word-wrap: break-word;
}
blockquote {
background: #f9f9f9;
border-left: 3px solid #3f3f3f;
display: inline-block;
margin: 0;
padding: 2px 5px 2px 2px;
}
blockquote p {
display: inline;
}
.user {
display: inline-block;
a.role {
display: inline-block;
color: #fff !important;
font-weight: bold;
padding: 4px 0.5em;
border-radius: 3px;
text-shadow: none;
line-height: 1em;
margin: 1px 0;
&.superadmin, &.admin {
background: #d22 !important;
}
&.mod {
background: #6af !important;
}
&.normal {
background: #aaa !important;
}
&.banned, &.disabled {
background: #ccc !important;
text-decoration: line-through !important;
color: #888 !important;
}
&:hover {
color: #ddd !important;
}
}
.donor {
background: #f60 !important;
border-radius: 3px;
color: #fff !important;
font-weight: bold !important;
margin-left: 3px;
padding: 0 0.5em;
display: inline-block;
}
.ign {
display: block;
color: #000;
font-style: italic;
}
}
#comments {
margin: 50px 0 0 40px;
}
.markdown-help {
margin: 4px 0 -4px;
background: #ddd;
padding: 0.5em 1em;
border-bottom: 1px solid;
}
select {
text-indent: 0.01px;
text-overflow: "";
}
input , select, textarea {
margin: 4px;
vertical-align: middle;
&[type=submit] {
margin: 0;
}
option {
padding: 0.5em;
&:hover {
background: #0f0;
color: #00f;
}
&:nth-child(even) {
background: #eee;
}
&:nth-child(odd) {
background: #ccc;
}
}
}
input[type=text], input[type=email], input[type=password], input[type=number], textarea, select {
background: #ddd;
border: none;
height: 3em;
margin: 4px 0 0;
padding: 0.5em 1em;
width: 100%;
}
input, select, textarea {
&.disabled, &[disabled] {
box-shadow: none;
background: #ddd;
}
}
textarea {
max-width: 100% !important;
height: 300px;
width: 100%;
padding: 1em;
min-height: 3.5em;
&.comment {
height: 75px;
}
&.full-width {
width: 100%;
}
&.vertical {
resize: vertical;
}
&.horizontal {
resize: horizontal;
}
}
tr.spacer {
height: 2em;
}
.field_with_errors {
input, select, textarea {
border: 1px solid #f00;
box-shadow: 0 0 5px #faa inset;
border-bottom: none;
}
.validation-error, .error {
display: inline-block;
padding: 0 1em;
width: 100%;
background: #faa;
font-weight: bold;
border: 1px solid #f00;
border-top: none;
}
}
.profile-action {
float: right;
}
.user-unconfirmed, .user-banned {
background: #ab0000;
color: #fff;
font-weight: bold;
padding: 4px 10px;
display: inline-block;
border-radius: 3px;
margin: 10px 0;
}
.btn {
margin: 1px 1px 0 0;
padding: 6px;
cursor: default;
color: #fff;
border: none;
font-size: 12px;
line-height: normal;
display: inline-block;
&[disabled], &[disabled]:hover {
box-shadow: 0 0 5px #ddd inset;
color: #ddd;
}
&.blue {
background: #4096ee;
&[disabled] {
background: #96c1ee;
}
}
&.red {
background: #ee4040;
&[disabled] {
background: #ee8383;
}
}
&.dark {
background: #363636;
}
&.donate {
padding-right: 30px;
&.paypal {
background-image: url(image_path('/assets/double_p.svg'));
background-repeat: no-repeat;
background-position: right 6px center;
}
}
&:hover {
box-shadow: 0 0 5px #095fb7 inset;
color: #fff;
}
}
#userlist {
.list-user {
margin: 15px 0;
a img {
vertical-align: middle;
border: 1px solid;
border-radius: 3px;
color: #222;
&:hover {
color: #ab0000;
}
}
.detail {
display: inline-block;
vertical-align: middle;
margin-left: 3px;
}
}
}
.editlink {
float: right;
opacity: 0;
margin-right: -10px;
transition: opacity 0.3s, margin 0.3s;
}
#blogpost_text {
width: 100%;
}
.clear {
clear: both;
display: block;
visibility: hidden;
}
.item-group {
margin: 30px 0;
&.with-avatar {
margin-left: 70px;
.avatar {
margin: -7px 0 0 -77px;
border: 1px solid #ccc;
border-radius: 5px;
float: left;
}
}
&:hover .editlink {
opacity: 1;
margin-right: 0;
}
&:target {
animation: target 2.5s;
-webkit-animation: target 2.5s;
}
.header {
background: #3f3f3f;
border-radius: 5px 5px 0 0;
padding: 0.5em;
border-bottom: 1px solid #ccc;
color: #fff;
text-shadow: 0 1px 1px #222;
a {
color: #fff;
&:hover {
color: #f66;
}
}
}
.items {
border: 1px solid #ddd;
border-top: none;
border-bottom: none;
.item {
display: block;
padding: 0.5em;
border-bottom: 1px solid #ddd;
&:target {
animation: target 2.5s;
-webkit-animation: target 2.5s;
}
&.locked:before {
content: " ";
background: url(image_path("lock.png")) no-repeat center center;
margin-right: 5px;
display: inline-block;
width: 20px;
height: 20px;
vertical-align: middle;
}
&.sticky:before {
content: " ";
background: url(image_path("pin.png")) no-repeat center center;
margin-right: 5px;
display: inline-block;
width: 20px;
height: 20px;
vertical-align: middle;
}
&.lockedsticky:before {
content: " ";
background: url(image_path("lock-pin.png")) no-repeat center center;
margin: -7px 5px -3px 0;
display: inline-block;
width: 20px;
height: 30px;
vertical-align: middle;
}
&.content {
.headline {
margin: 0;
border-bottom: 1px solid #ddd;
}
overflow-x: auto;
}
}
}
}
.donation {
margin-bottom: 3em;
}
.bold {
font-weight: bold;
}
iframe.youtube {
border: none;
width: 640px;
max-width: 100%;
height: 360px;
}
mark {
background: #faa;
padding: 0 2px;
border-radius: 3px;
}
.comment-counter {
float: right;
}
.red-alert {
color: #ab0000;
font-weight: bold;
}
table {
width: 100%;
max-width: 100%;
table-layout: fixed;
}
img {
max-width: 100%;
}
.left {
float: left;
}
.right {
float: right;
}
#footer {
padding: 0 100px 30px;
width: 1600px;
max-width: 100%;
margin: auto;
text-align: center;
.note {
color: #888;
font-size: 12px;
font-style: italic;
margin-top: 5em;
}
}

View File

@@ -5,7 +5,7 @@ class ForumgroupsController < ApplicationController
end
def show
redirect_to forums_path + "#forum-#{params[:id]}"
redirect_to forums_path + "#group-#{params[:id]}"
end
def edit

View File

@@ -3,11 +3,15 @@ class ForumsController < ApplicationController
def index
@groups = Forumgroup.select {|g| g.can_read?(current_user) }
@groups.sort_by!{|g| g[:position]}
@groups.sort_by!{ |g| g.position || 0 }
end
def show
@threads = @forum.forumthreads.order("sticky desc, updated_at desc")
@threads = @forum.forumthreads.to_a
@threads.sort_by! do |t|
# sticky goes first, then sort by last activity (new replies)
[t.sticky ? 0 : 1, -(t.replies.last.try(:created_at) || t.created_at).to_i]
end
end
def edit

View File

@@ -12,7 +12,7 @@ class ForumthreadsController < ApplicationController
def update
if mod? || @thread.author.is?(current_user)
@thread.user_editor = current_user
@thread.attributes = thread_params([:user_editor])
@thread.attributes = (mod? ? thread_params([:sticky, :locked, :forum_id]) : thread_params)
if @thread.save
redirect_to @thread, notice: 'Post has been updated.'
else

View File

@@ -1,6 +0,0 @@
[yt](729o_Xwg1WU)
\[yt\]\(([a-zA-Z0-9\-_]+)\)
https://www.youtube.com/embed/{id}?theme=light&iv_load_policy=3&showinfo=1&showsearch=0&rel=0&modestbranding&hd=1&autohide=1&html5=1

View File

@@ -20,6 +20,7 @@ module ApplicationHelper
filter_html: true,
no_styles: true,
safe_links_only: true,
with_toc_data: true,
hard_wrap: true,
link_attributes: {target: "_blank", rel: "nofollow"}
})
@@ -46,6 +47,7 @@ module ApplicationHelper
no_images: true,
no_styles: true,
safe_links_only: true,
with_toc_data: false,
hard_wrap: false,
link_attributes: {target: "_blank", rel: "nofollow"}
})

View File

@@ -3,13 +3,13 @@ class RedstonerMailer < ActionMailer::Base
default from: "info@redstoner.com"
default reply_to: "redstonerserver+website@gmail.com"
def register_mail(user, uses_mc_pass)
def register_mail(user, uses_mc_pass)
@user = user
@mcpw = uses_mc_pass
mail(to: @user.email, subject: "Registration on Redstoner.com", from: "info@redstoner.com", reply_to: "redstonerserver+website@gmail.com")
end
def register_info_mail(user, uses_mc_pass)
def register_info_mail(user, uses_mc_pass)
@user = user
@mcpw = uses_mc_pass
mail(to: "redstonerserver@gmail.com", subject: "#{@user.name} registered on Redstoner.com", from: "info@redstoner.com", reply_to: "redstonerserver+website@gmail.com")

View File

@@ -15,7 +15,12 @@ class Blogpost < ActiveRecord::Base
end
def editor
# can be nil
@editor ||= user_editor
end
def edited?
!!user_editor_id
end
end

View File

@@ -16,4 +16,13 @@ class Comment < ActiveRecord::Base
User.first
end
end
def editor
# can be nil
@editor ||= user_editor
end
def edited?
!!user_editor_id
end
end

View File

@@ -23,9 +23,14 @@ class Forumthread < ActiveRecord::Base
end
def editor
# can be nil
@editor ||= user_editor
end
def edited?
!!user_editor_id
end
def replies
threadreplies
end

View File

@@ -15,8 +15,14 @@ class Role < ActiveRecord::Base
!!(Role.find_by_name(name) == self)
end
def self.get (name)
Role.find_by_name(name)
def self.get (input)
if input.is_a?(String) || input.is_a?(Symbol)
Role.find_by_name(input)
elsif input.is_a?(Fixnum)
Role.find_by_id(input)
elsif input.is_a?(Role)
return input
end
end
def <=> (role)

View File

@@ -21,6 +21,11 @@ class Threadreply < ActiveRecord::Base
end
def editor
# can be nil
@editor ||= user_editor
end
def edited?
!!user_editor_id
end
end

View File

@@ -7,7 +7,7 @@ class User < ActiveRecord::Base
has_secure_password
before_validation :strip_whitespaces, :set_uuid, :set_name, :set_role, :set_email_token
before_validation :strip_whitespaces, :set_uuid, :set_name, :set_email_token
validates_presence_of :password, :password_confirmation, :email_token, :on => :create
validates_presence_of :name, :email, :ign
@@ -38,6 +38,10 @@ class User < ActiveRecord::Base
!!self.confirmed
end
def online?
last_seen && last_seen > 5.minutes.ago
end
#roles
def disabled?
!!(self.role == :disabled)
@@ -179,10 +183,6 @@ class User < ActiveRecord::Base
self.name ||= self.ign
end
def set_role
self.role ||= Role.get(:normal)
end
def account_exists?
profile = self.get_profile
if !profile || profile["demo"] == true

View File

@@ -0,0 +1,12 @@
<div class="markdown-help">
<blockquote>&gt; quote</blockquote> |
_underline_ |
<i>*italic*</i> |
<b>**bold**</b> |
<code>`code`</code> |
<mark>==mark==</mark> |
[<a>link</a>](https://example.com)
<%= link_to "more...", "/info/1", target: "_blank", class: "right", tabindex: -1 %>
<div class="clear"></div>
</div>

View File

@@ -1,8 +1,8 @@
<h1>Edit post</h1>
<p id="markdown-note">Note: You can use <%= link_to "Markdown", "https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet", target: "_blank" %>!</p>
<%= simple_form_for @post do |f|%>
<%= f.input :title, :label => false %>
<%= f.text_area :content, :label => false, input_html: {class: "full-width vertical"} %>
<%= form_for @post do |f|%>
<%= f.text_field :title %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, class: "vertical" %>
<p><%= f.submit "Update Post", class: "btn blue left" %></p>
<% end %>
<p><%= button_to "Delete post", @post, method: "delete", data: {confirm: "Delete post & comments forever?"}, class: "btn red right" %></p>

View File

@@ -3,9 +3,9 @@
<div id="posts">
<% @posts.each do |p| %>
<div class="item-group with-avatar" id="post-<%= p.id %>">
<%= link_to(image_tag(p.author.avatar_url(64), class: "avatar"), p.author, title: p.author.ign) %>
<div class="header">
<%= render partial: "users/username", locals: { user: p.author } %> <time><%= link_to p.created_at.strftime("%e. %b %Y, %H:%m"), p %></time>
<%= link_to(image_tag(p.author.avatar_url(64), class: "avatar"), p.author, title: p.author.ign) %>
<%= render partial: "users/username", locals: { user: p.author } %> <time><%= link_to p.created_at.strftime("%e. %b %Y, %H:%M"), p %></time>
<span class="comment-counter">
<%= link_to pluralize(p.comments.count, "Comment"), p %>
</span>

View File

@@ -1,7 +1,7 @@
<h1>New Post</h1>
<%= simple_form_for @post do |f|%>
<%= f.input :title, placeholder: "Title" %>
<p id="markdown-note">Note: You can use <%= link_to "Markdown", "https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet", target: "_blank" %>!</p>
<%= f.text_area :content, placeholder: "Text", input_html: {class: "full-width vertical"} %>
<%= form_for @post do |f|%>
<%= f.text_field :title, placeholder: "Title" %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Text", input_html: {class: "vertical"} %>
<p><%= f.submit "Create Post", class: "btn blue left" %></p>
<% end %>

View File

@@ -1,8 +1,8 @@
<%= link_to "News", blogposts_path %> → <%= link_to @post.title %>
<div class="item-group post with-avatar" id="post-<%= @post.id %>">
<%= link_to(image_tag(@post.author.avatar_url(64), class: "avatar"), @post.author, title: @post.author.ign) %>
<div class="header">
<%= render partial: "users/username", locals: { user: @post.author } %> <time><%= link_to @post.created_at.strftime("%e. %b %Y, %H:%m"), p %></time>
<%= link_to(image_tag(@post.author.avatar_url(64), class: "avatar"), @post.author, title: @post.author.ign) %>
<%= render partial: "users/username", locals: { user: @post.author } %> <time><%= link_to @post.created_at.strftime("%e. %b %Y, %H:%M"), p %></time>
<%= link_to "edit", edit_blogpost_path(@post.id), class: "editlink" if mod? %>
</div>
<div class="items">

View File

@@ -1,7 +1,9 @@
<div class="item-group with-avatar comment" id="comment-<%= c.id %>">
<%= link_to(image_tag(c.author.avatar_url(64), class: "avatar"), c.author, title: c.author.ign) %>
<div class="header <%= "op" if c.author.is?(c.blogpost.author) %>">
<%= render partial: "users/username", locals: { user: c.author } %> <time><%= link_to c.created_at.strftime("%e. %b %Y, %H:%m"), [c.blogpost, c] %></time>
<%= link_to(image_tag(c.author.avatar_url(64), class: "avatar"), c.author, title: c.author.ign) %>
<%= render partial: "users/username", locals: { user: c.author } %>
<time><%= link_to c.created_at.strftime("%e. %b %Y, %H:%M"), "#comment-#{c.id}" %></time>
<%= link_to "edit", edit_blogpost_comment_path(c.blogpost, c), class: "editlink" if (mod? || c.author.is?(current_user)) %>
</div>
<div class="items">

View File

@@ -1,8 +1,8 @@
<% if current_user %>
<h3>New comment</h3>
<%= simple_form_for [@post, @comment] do |f| %>
<p><blockquote>&gt; quote</blockquote> | _underline_ | <i>*italic*</i> | <b>**bold**</b> | <code>`code`</code> | <mark>==mark==</mark> | <a>[link](https://example.com)</a>
<%= f.input :content, :label => false, :as => "text", :placeholder => "Comment", input_html: {class: "comment"} %>
<%= f.submit class: "btn blue" %>
<%= form_for [@post, @comment] do |f| %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Comment", class: "comment" %>
<p><%= f.submit class: "btn blue" %></p>
<% end %>
<% end %>

View File

@@ -1,7 +1,8 @@
<h1>Edit comment</h1>
<%= simple_form_for [@comment.blogpost, @comment] do |f| %>
<%= f.input :content, label: false, as: "text", placeholder: "Comment" %>
<%= form_for [@comment.blogpost, @comment] do |f| %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Comment" %>
<p><%= f.submit "Update Comment", class: "btn blue left" %></p>
<% end %>
<p><%= button_to "Delete comment", [@comment.blogpost, @comment] , method: "delete", data: {confirm: "Delete comment forever?"}, class: "btn red right" %></p>

View File

@@ -32,6 +32,6 @@
<td><%= f.select :role_write_id, role_selection, include_blank: false %></td>
</tr>
</table>
<p><%= f.submit "Update group", class: "btn blue" %></p>
<p><%= f.submit "Update group", class: "btn blue left" %></p>
<% end %>
<p><%= button_to "Delete group", @post, :method => "delete", data: {confirm: "Delete group?\nForums + Threads will not be accessible!"}, class: "btn red right" %></p>

View File

@@ -1,15 +1,15 @@
<div id="forum_groups">
<% @groups.each do |group| %>
<div class="item-group" id="forum-<%= group.id %>">
<div class="item-group" id="group-<%= group.id %>">
<div class="header">
<%= group.name %>
<%= link_to "edit", edit_forumgroup_path(group), class: "editlink" if admin? %>
</div>
<div class="items bold">
<% group.forums.each do |f| %>
<% group.forums.sort_by{ |f| f.position || 0 }.each do |f| %>
<% if f.can_read?(current_user) %>
<%= link_to f.name, f, class: "item" %>
<%= link_to f.name, f, id: "forum-#{f.id}", class: "item" %>
<% end %>
<% end %>
</div>
@@ -21,5 +21,5 @@
<% if admin? %>
<%= link_to "New group", new_forumgroup_path, class: "btn blue" %>
<% elsif mod? %>
<%= link_to "New group", nil, class: "btn blue", disabled: true %>
<%= link_to "New group", "#", class: "btn blue", disabled: true %>
<% end %>

View File

@@ -7,9 +7,9 @@
<div id="forum_groups">
<% @threads.each do |thread| %>
<div class="item-group with-avatar" id="thread-<%= thread.id %>">
<%= link_to(image_tag(thread.author.avatar_url(64), class: "avatar"), thread.author, title: thread.author.ign) %>
<div class="header">
<%= render partial: "users/username", locals: { user: thread.author } %> <time><%= link_to thread.created_at.strftime("%e. %b %Y, %H:%m"), thread %></time>
<%= link_to(image_tag(thread.author.avatar_url(64), class: "avatar"), thread.author, title: thread.author.ign) %>
<%= render partial: "users/username", locals: { user: thread.author } %> <time><%= link_to thread.created_at.strftime("%e. %b %Y, %H:%M"), thread %></time>
<span class="comment-counter">
<%= link_to pluralize(thread.replies.count, "Reply"), thread %>
</span>

View File

@@ -11,12 +11,21 @@
<td><%= f.label :locked %></td>
<td><%= f.check_box :locked %></td>
</tr>
<tr>
<td><%= f.label :forum_id, "Move thread" %></td>
<%
forums = []
Forum.all.sort_by{ |f| f.forumgroup.position || 0 }.each do |f|
forums << ["#{f.forumgroup.name} → #{f.name}", f.id]
end
%>
<td><%= f.select :forum_id, forums %></td>
</tr>
<% end %>
</table>
<div id="form_inputs">
<%= f.text_field :title, placeholder: "Title" %>
</div>
<%= f.text_field :title, placeholder: "Title" %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Text" %>
<p><%= f.submit "Update thread", class: "btn blue" %></p>
<p><%= f.submit "Update thread", class: "btn blue left" %></p>
<% end %>
<%= button_to "Delete thread", @thread, :method => "delete", data: {confirm: "Delete thread & comments forever?"}, class: "btn red right" %>

View File

@@ -13,9 +13,8 @@
</tr>
<% end %>
</table>
<div id="form_inputs">
<%= f.text_field :title, placeholder: "Title" %>
</div>
<%= f.text_field :title, placeholder: "Title" %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Text" %>
<%= f.hidden_field :forum_id %>
<p><%= f.submit "Create thread", class: "btn blue" %></p>

View File

@@ -1,11 +1,16 @@
<%= link_to @thread.forum.group, forumgroup_path(@thread.forum.group) %> → <%= link_to @thread.forum, @thread.forum %> → <%= link_to @thread %>
<div class="item-group thread with-avatar" id="thread-<%= @thread.id %>">
<%= link_to(image_tag(@thread.author.avatar_url(64), class: "avatar"), @thread.author, title: @thread.author.ign) %>
<div class="header">
<%= render partial: "users/username", locals: { user: @thread.author } %> <time><%= link_to @thread.created_at.strftime("%e. %b %Y, %H:%m"), p %></time>
<%= link_to(image_tag(@thread.author.avatar_url(64), class: "avatar"), @thread.author, title: @thread.author.ign) %>
<%= render partial: "users/username", locals: { user: @thread.author } %> <time><%= link_to @thread.created_at.strftime("%e. %b %Y, %H:%M"), p %></time>
<%= link_to "edit", edit_forumthread_path( @thread), class: "editlink" if (@thread.author.is?(current_user) || mod?) %>
</div>
<div class="items">
<% if @thread.edited? %>
<div class="item edited">
Last edited <time><%= @thread.updated_at.strftime("%e. %b %Y, %H:%M") %></time> by <%= link_to @thread.editor.name, @thread.editor %>.
</div>
<% end %>
<div class="item content">
<h2 class="headline"><%= link_to truncate(@thread.title, length: 60, omission: " …"), p %></h2>
<%= render_md(@thread.content).html_safe %>

View File

@@ -1,7 +1,8 @@
<h1>Edit Info</h1>
<%= form_for @info do |f|%>
<%= f.text_field :title, :label => false %>
<%= f.text_area :content, :label => false, input_html: {class: "full-width vertical"} %>
<%= f.text_field :title%>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, class: "vertical" %>
<p><%= f.submit "Update Info", class: "btn blue left" %></p>
<% end %>
<p><%= button_to "Delete Info", @info, method: "delete", data: {confirm: "Delete Info forever?"}, class: "btn red right" %></p>

View File

@@ -1,9 +1,9 @@
<h1>Info</h1>
<% if mod? %>
<%= link_to "New Info", new_info_path, class: "btn blue" %>
<% end %>
<ul>
<% @info.each do |info| %>
<li><%= link_to info.title, info %></li>
<% end %>
</ul>
<% if mod? %>
<%= link_to "New Info", new_info_path, class: "btn blue" %>
<% end %>
</ul>

View File

@@ -1,6 +1,7 @@
<h1>New Info</h1>
<%= form_for @info, url: info_index_path do |f|%>
<%= f.text_field :title, placeholder: "Title" %>
<%= f.text_area :content, placeholder: "Text", input_html: {class: "full-width vertical"} %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Text", class: "vertical" %>
<p><%= f.submit "Create Info", class: "btn blue left" %></p>
<% end %>

View File

@@ -1,3 +1,5 @@
<%= link_to "Info", info_index_path %> → <%= @info.title %>
<%= link_to "Edit Info", edit_info_path(@info), class: "btn blue right" %>
<div class="clear"></div>
<h1><%= @info.title %></h1>
<div class="post"><%= render_md(@info.content).html_safe %></div>

View File

@@ -0,0 +1,12 @@
<% users = User.select{|u| u.online?} %>
<div id="footer">
<div id="online-users">
<p title="Seen within the last 5 minutes">Users currently online: <%= users.length %></p>
<% users.each do |u| %>
<%= render partial: "users/username", locals: { user: u } %>
<% end %>
</div>
<div class="note">
Website made by <a href="/users/2">Redstone Sheep</a> with design by <a href="/users/12">ColoArtz</a>.
</div>
</div>

View File

@@ -11,11 +11,12 @@
</head>
<body>
<div id="mobile-info">We don't have a mobile style yet. It might look shitty.<br>Tip: Hold your device in landscape mode.</div>
<%= render "/layouts/head" %>
<%= render partial: "/layouts/head" %>
<div id="main-content">
<%= "<div id='alert' class='flash'>#{alert}</div>".html_safe if alert %>
<%= "<div id='notice' class='flash'>#{notice}</div>".html_safe if notice %>
<%= "<div class='flash alert'>#{alert}</div>".html_safe if alert %>
<%= "<div class='flash notice'>#{notice}</div>".html_safe if notice %>
<%= yield %>
</div>
<%= render partial: "/layouts/footer" %>
</body>
</html>

View File

@@ -1,29 +1,39 @@
<p><%= @user.name %> has registered on redstoner.</p>
<p>
<table style="border: 1px solid black; border-collapse:collapse;">
<tr>
<td style="border:1px solid black;">IGN</td>
<td style="border:1px solid black;"><%= @user.ign %></td>
</tr>
<tr>
<td style="border:1px solid black;">email</td>
<td style="border:1px solid black;"><%= @user.email %></td>
</tr>
<tr>
<td style="border:1px solid black;">Time</td>
<td style="border:1px solid black;"><%= @user.created_at %></td>
</tr>
<tr>
<td style="border:1px solid black;">IP</td>
<td style="border:1px solid black;"><%= @user.last_ip %></td>
</tr>
</table>
</p>
<% if @mcpw %>
<p>
<font color="red">
<b>USER IS AN IDIOT!</b>
</font>
</p>
<% end %>
<h1>'<%= @user.name %>' has registered on redstoner.</h1>
<table style="border: 1px solid black; border-collapse:collapse;">
<tr>
<td style="border:1px solid black;">IGN</td>
<td style="border:1px solid black;"><%= @user.ign %></td>
</tr>
<tr>
<td style="border:1px solid black;">UUID</td>
<td style="border:1px solid black;"><%= @user.uuid %></td>
</tr>
<tr>
<td style="border:1px solid black;">email</td>
<td style="border:1px solid black;"><%= @user.email %></td>
</tr>
<tr>
<td style="border:1px solid black;">Time</td>
<td style="border:1px solid black;"><%= @user.created_at.strftime("%e. %b %Y, %H:%M") %></td>
</tr>
<tr>
<td style="border:1px solid black;">Role</td>
<td style="border:1px solid black;"><%= @user.role %></td>
</tr>
<tr>
<td style="border:1px solid black;">IP</td>
<td style="border:1px solid black;"><%= @user.last_ip %></td>
</tr>
<tr>
<td style="border:1px solid black;">Idiot</td>
<% if @mcpw %>
<td style="border:3px solid red; color: red; font-weight: bold">YES! (used his mc pass) &gt;_&lt;</td>
<% else %>
<td style="border:1px solid black;">no</td>
<% end %>
</tr>
</table>
<hr>
<% debug = @user.attributes.dup %>
<% debug.delete("password_digest") %>
<p><small style="font-size: 0.7em; color: #aaa;">Debug info:<br><%= debug %></small>

View File

@@ -3,22 +3,17 @@
Hi <%= @user.name %>!
<p>Thank you for registering on Redstoner.com!</p>
<p>To use your account, you need to <%= link_to "confirm", confirm_user_path(@user, code: @user.email_token, only_path: false) %> your email address.</p>
<p>To use your account, you need to <%= link_to "confirm", confirm_user_path(@user, code: @user.email_token, only_path: false), style: "text-decoration: none; color: #4096EE;" %> your email address.</p>
<div>
<% if @mcpw %>
<div>
<p>
<font color="red">
<b>NEVER USE THE SAME PASSWORD TWICE!</b>
</font>
</p>
<p>
<font color="red">
You used your minecraft password on our website. <b>Do not do that</b>. It's just stupid.
</font>
</p>
<div style="background: #500; color: #f00; padding: 0.5em 1em;">
<h2>WARNING!</h2>
<p>Never use the same password on different sites, that is how accers gain access to accounts.</p>
<p>You have used your minecraft password on our website.<br>
<b>Don't do that</b>! It's stupid.</p>
<p>If you are using this password elsewhere, change it. Now.</p>
</div>
<% end %>
@@ -30,7 +25,7 @@
</div>
<p></p>
<p>If you have any questions or problems, just ask one of our <%= link_to "Staff", users_path(role: "staff", only_path: false) %> in-game.</p>
<p>If you have any questions or problems, just ask one of our <%= link_to "Staff", users_path(role: "staff", only_path: false), style: "text-decoration: none; color: #4096EE;" %> in-game.</p>
<p>Your Redstoner team</p>
</div>
@@ -38,6 +33,11 @@
<div style="background: none repeat scroll 0% 0% rgb(68, 68, 68); width: 100%; padding: 2em; color: rgb(255, 255, 255); margin:auto; text-align: center;">
<p><i>If you did not sign up on redstoner.com you can safely ignore this email!</i>
</p>
<p>You can contact us via: <%= link_to "Website", "root_path" %> | <%= link_to "Twitter", "https://twitter.com/RedstonerServer" %> | <%= link_to "Google+", "https://google.com/+Redstoner" %> | <%= link_to "Email", "mailto:redstonerserver+website@gmail.com" %></p>
<p>You can contact us via:
<%= link_to "Website", "root_path", style: "text-decoration: none; color: #4096EE;" %> |
<%= link_to "Twitter", "https://twitter.com/RedstonerServer", style: "text-decoration: none; color: #4096EE;" %> |
<%= link_to "Google+", "https://google.com/+Redstoner", style: "text-decoration: none; color: #4096EE;" %> |
<%= link_to "Email", "mailto:redstonerserver+website@gmail.com", style: "text-decoration: none; color: #4096EE;" %>
</p>
</div>
</div>

View File

@@ -24,21 +24,30 @@
<div class="donation">
<h1>Donate to Redstone Sheep</h1>
<h4>Sheep is our admin. He fixes everything &amp; keeps the server running.</h4>
<form target="_top" method="post" action="https://www.paypal.com/cgi-bin/webscr">
<input name="custom" type="text" placeholder="Your Minecraft name" value="<%= current_user.try(:ign) %>">
<form target="_blank" method="post" action="https://www.paypal.com/cgi-bin/webscr">
<% if current_user %>
<input name="custom" type="hidden" placeholder="Your Minecraft name" value="<%= current_user.ign %>">
<% else %>
<input name="custom" type="text" placeholder="Your Minecraft name">
<% end %>
<input value="_s-xclick" name="cmd" type="hidden">
<input value="HPWLQLL87GTHC" name="hosted_button_id" type="hidden">
<input value="Donate" name="Donate" type="submit" class="btn blue">
<input value="Donate" name="Donate" type="submit" class="btn dark donate paypal">
</form>
</div>
<div class="donation">
<h1>Donate to PanFritz</h1>
<h4>Pan hosts the Server.</h4>
<form target="_top" method="post" action="https://www.paypal.com/cgi-bin/webscr">
<input name="custom" type="text" placeholder="Your Minecraft name" value="<%= current_user.try(:ign) %>">
<form target="_blank" method="post" action="https://www.paypal.com/cgi-bin/webscr">
<% if current_user %>
<input name="custom" type="hidden" placeholder="Your Minecraft name" value="<%= current_user.ign %>">
<% else %>
<input name="custom" type="text" placeholder="Your Minecraft name">
<% end %>
<input value="_s-xclick" name="cmd" type="hidden">
<input value="SW8TJLDK9FX3W" name="hosted_button_id" type="hidden">
<input value="Donate" name="Donate" type="submit" class="btn blue">
<input value="Donate" name="Donate" type="submit" class="btn dark donate paypal">
</form>
</div>
</div>

View File

@@ -1,4 +1,3 @@
<div id="delete_me" class="delete_me"> <!-- delete this div -->
<h1>The loneliest page in the world</h1>
<iframe width="420" height="315" src="//www.youtube.com/embed/N3O20EOE-p4?theme=light&color=red" frameborder="0" allowfullscreen></iframe>
</div>
<h1>Redstoner</h1>
<p>We need some text here</p>
<p>Any suggestions?</p>

View File

@@ -1,7 +1,9 @@
<div class="item-group thread-reply with-avatar" id="reply-<%= reply.id %>">
<%= link_to(image_tag(reply.author.avatar_url(64), class: "avatar"), reply.author, title: reply.author.ign) %>
<div class="header">
<%= render partial: "users/username", locals: { user: reply.author } %> <time><%= link_to reply.created_at.strftime("%e. %b %Y, %H:%m"), "#reply-#{reply.id}" %></time>
<%= link_to(image_tag(reply.author.avatar_url(64), class: "avatar"), reply.author, title: reply.author.ign) %>
<%= render partial: "users/username", locals: { user: reply.author } %>
<time><%= link_to reply.created_at.strftime("%e. %b %Y, %H:%M"), "#reply-#{reply.id}" %></time>
<%= link_to "edit", edit_forumthread_threadreply_path(reply.thread, reply), class: "editlink" if mod? || reply.thread.author.is?(current_user) %>
</div>
<div class="items">

View File

@@ -1,6 +1,8 @@
<%= link_to @reply.thread.forum.group, forumgroup_path(@reply.thread.forum.group) %> → <%= link_to @reply.thread.forum, @reply.thread.forum %> → <%= link_to @reply.thread %> → Edit reply
<h1>Edit reply</h1>
<%= form_for [@reply.thread, @reply] do |f| %>
<%= render partial: "mdhelp" %>
<%= f.text_area :content, placeholder: "Text" %>
<p><%= f.submit "Reply", class: "btn blue" %></p>
<% end %>
<p><%= f.submit "Reply", class: "btn blue left" %></p>
<% end %>
<p><%= button_to "Delete reply", [@reply.thread, @reply], method: "delete", data: {confirm: "Delete reply forever?"}, class: "btn red right" %></p>

View File

@@ -1,13 +1,8 @@
<h1>Change password</h1>
<%= simple_form_for @user do |f| %>
<div id="form_labels">
</div>
<div id="form_inputs">
<%= f.input :current_password, :label => false %>
<%= f.input :email, :label => false %>
<%= f.input :password, :label => false %>
<%= f.input :password_confirmation, :label => false %>
</div>
<%= form_for @user do |f| %>
<%= f.text_field :current_password %>
<%= f.text_field :email %>
<%= f.text_field :password %>
<%= f.text_field :password_confirmation %>
<% end %>

View File

@@ -1,34 +1,27 @@
<% def can_edit?; (@user.is?(current_user) && confirmed?) || (mod? && current_user.role >= @user.role); end %>
<%
def can_edit?
(@user.is?(current_user) && confirmed?) || (mod? && current_user.role >= @user.role)
end
%>
<%= link_to (@user.is?(current_user) ? "Your profile" : @user.name), current_user %> → Edit
<h1>Edit profile</h1>
<%= simple_form_for @user do |f| %>
<%= form_for @user do |f| %>
<table>
<tbody>
<tr>
<td></td>
<td><%= image_tag @user.avatar_url(128), :class => "user-avatar avatar", :alt => "avatar" %></td>
</tr>
<tr>
<td>Display name</td>
<td>
<%= f.input :name, :label => false, disabled: !can_edit? %>
<%= f.text_field :name, disabled: !can_edit? %>
</td>
</tr>
<% if mod? %>
<tr>
<td>In-game name</td>
<td>
<%= f.input :ign, :label => false, disabled: !(mod? && current_user.role >= @user.role) %>
</td>
</tr>
<tr>
<td>Role</td>
<td>
<% if mod? && current_user.role >= @user.role %>
<%= f.association :role, :label => false, :collection => Role.all_to(current_user.role), :include_blank => false %>
<% else %>
<%= f.input :role, label: false, disabled: true %>
<%= f.select :role, Role.all_to(current_user.role) %>
<% end %>
</td>
</tr>
@@ -36,36 +29,39 @@
<tr>
<td>Skype username</td>
<td>
<%= f.input :skype, label: false, placeholder: "Skype username", disabled: !can_edit? %>
<%= f.text_field :skype, placeholder: "Skype username", disabled: !can_edit? %>
</td>
</tr>
<tr>
<td>Show Skype to</td>
<td>
<%= f.input :skype_public, label: false, as: :select, collection: [["Staff only", false], ["All users", true]], include_blank: false, input_html: { disabled: !can_edit? } %>
<%= f.select :skype_public, [["Staff only", false], ["All users", true]], {}, { disabled: !can_edit? } %>
</td>
</tr>
<tr>
<td>YouTube username</td>
<td>
<%= f.input :youtube, :label => false, placeholder: "YouTube username", disabled: !can_edit? %>
<%= f.text_field :youtube, placeholder: "YouTube username", disabled: !can_edit? %>
</td>
</tr>
<tr>
<td>Twitter username</td>
<td>
<%= f.input :twitter, :label => false, placeholder: "Twitter username", disabled: !(@user.is?(current_user) && confirmed? || (mod? && current_user.role >= @user.role)) %>
<%= f.text_field :twitter, placeholder: "Twitter username", disabled: !(@user.is?(current_user) && confirmed? || (mod? && current_user.role >= @user.role)) %>
</td>
</tr>
<tr>
<td>About you</td>
<td>
<%= f.input :about, :label => false, :input_html => {:class => "vertical"}, placeholder: "Tell us something about you...", disabled: !can_edit? %>
<%= render partial: "mdhelp" %>
<%= f.text_area :about, class: "vertical", placeholder: "Tell us something about you...", disabled: !can_edit? %>
</td>
</tr>
</tbody>
</table>
<%= f.submit "Save profile", class: "btn blue", disabled: (!@user.confirmed? && @user.is?(current_user)) %>
<p><%= f.submit "Save profile", class: "btn blue", disabled: (!@user.confirmed? && @user.is?(current_user)) %></p>
<% if !@user.confirmed? %>
<% if @user.is?(current_user) %>
<span class='red-alert'>Please confirm your email adress first!</span>
@@ -73,5 +69,4 @@
<span class='red-alert'>This user has not confirmed his email!</span>
<% end %>
<% end %>
<%= link_to "Cancel", @user, class: "btn red right" %>
<% end %>

View File

@@ -11,6 +11,7 @@
<%= link_to "revert", unbecome_users_path, :class => "btn blue" %>
<% end %>
</div>
<div class="clear"></div>
<% if @user.banned? %>
<span class="user-banned">This user is banned!</span>
@@ -63,7 +64,7 @@
<% end %>
<tr>
<td>Joined</td>
<td><%= @user.created_at.strftime("%e. %b %Y, %H:%m") %></td>
<td><%= @user.created_at.strftime("%e. %b %Y, %H:%M") %></td>
</tr>
<% if mod? || @user.is?(current_user) %>
<tr>

View File

@@ -1,142 +0,0 @@
# Use this setup block to configure all options available in SimpleForm.
SimpleForm.setup do |config|
# Wrappers are used by the form builder to generate a
# complete input. You can remove any component from the
# wrapper, change the order or even add your own to the
# stack. The options given below are used to wrap the
# whole input.
config.wrappers :default, :class => :input,
:hint_class => :field_with_hint, :error_class => :field_with_errors do |b|
## Extensions enabled by default
# Any of these extensions can be disabled for a
# given input by passing: `f.input EXTENSION_NAME => false`.
# You can make any of these extensions optional by
# renaming `b.use` to `b.optional`.
# Determines whether to use HTML5 (:email, :url, ...)
# and required attributes
b.use :html5
# Calculates placeholders automatically from I18n
# You can also pass a string as f.input :placeholder => "Placeholder"
b.use :placeholder
## Optional extensions
# They are disabled unless you pass `f.input EXTENSION_NAME => :lookup`
# to the input. If so, they will retrieve the values from the model
# if any exists. If you want to enable the lookup for any of those
# extensions by default, you can change `b.optional` to `b.use`.
# Calculates maxlength from length validations for string inputs
b.optional :maxlength
# Calculates pattern from format validations for string inputs
b.optional :pattern
# Calculates min and max from length validations for numeric inputs
b.optional :min_max
# Calculates readonly automatically from readonly attributes
b.optional :readonly
## Inputs
b.use :input
b.use :hint, :wrap_with => { :tag => :span, :class => :hint }
b.use :error, :wrap_with => { :tag => :span, :class => :error }
end
# The default wrapper to be used by the FormBuilder.
config.default_wrapper = :default
# Define the way to render check boxes / radio buttons with labels.
# Defaults to :nested for bootstrap config.
# :inline => input + label
# :nested => label > input
config.boolean_style = :nested
# Default class for buttons
config.button_class = 'btn'
# Method used to tidy up errors. Specify any Rails Array method.
# :first lists the first message for each field.
# Use :to_sentence to list all errors for each field.
# config.error_method = :first
# Default tag used for error notification helper.
config.error_notification_tag = :div
# CSS class to add for error notification helper.
config.error_notification_class = 'alert alert-error'
# ID to add for error notification helper.
# config.error_notification_id = nil
# Series of attempts to detect a default label method for collection.
# config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
# Series of attempts to detect a default value method for collection.
# config.collection_value_methods = [ :id, :to_s ]
# You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
# config.collection_wrapper_tag = nil
# You can define the class to use on all collection wrappers. Defaulting to none.
# config.collection_wrapper_class = nil
# You can wrap each item in a collection of radio/check boxes with a tag,
# defaulting to :span. Please note that when using :boolean_style = :nested,
# SimpleForm will force this option to be a label.
# config.item_wrapper_tag = :span
# You can define a class to use in all item wrappers. Defaulting to none.
# config.item_wrapper_class = nil
# How the label text should be generated altogether with the required text.
# config.label_text = lambda { |label, required| "#{required} #{label}" }
# You can define the class to use on all labels. Default is nil.
config.label_class = 'control-label'
# You can define the class to use on all forms. Default is simple_form.
# config.form_class = :simple_form
# You can define which elements should obtain additional classes
# config.generate_additional_classes_for = [:wrapper, :label, :input]
# Whether attributes are required by default (or not). Default is true.
# config.required_by_default = true
# Tell browsers whether to use default HTML5 validations (novalidate option).
# Default is enabled.
config.browser_validations = false
# Collection of methods to detect if a file type was given.
# config.file_methods = [ :mounted_as, :file?, :public_filename ]
# Custom mappings for input types. This should be a hash containing a regexp
# to match as key, and the input type that will be used when the field name
# matches the regexp as value.
# config.input_mappings = { /count/ => :integer }
# Custom wrappers for input types. This should be a hash containing an input
# type as key and the wrapper that will be used for all inputs with specified type.
# config.wrapper_mappings = { :string => :prepend }
# Default priority for time_zone inputs.
# config.time_zone_priority = nil
# Default priority for country inputs.
# config.country_priority = nil
# Default size for text inputs.
# config.default_input_size = 50
# When false, do not use translations for labels.
# config.translate_labels = true
# Automatically discover new inputs in Rails' autoload path.
# config.inputs_discovery = true
# Cache SimpleForm inputs discovery
# config.cache_discovery = !Rails.env.development?
end

View File

@@ -1,8 +1,4 @@
en:
simple_form:
required:
text: 'required'
mark: ''
errors:
format: "%{message}"
activerecord:

View File

@@ -1,25 +0,0 @@
en:
simple_form:
"yes": 'Yes'
"no": 'No'
required:
text: 'required'
mark: ''
# You can uncomment the line below if you need to overwrite the whole required html.
# When using html, text and mark won't be used.
html: ''
error_notification:
default_message: "Please fill out all required fields:"
# Labels and hints examples
# labels:
# defaults:
# password: 'Password'
# user:
# new:
# email: 'E-mail to sign in.'
# edit:
# email: 'E-mail.'
# hints:
# defaults:
# username: 'User name to sign in.'
# password: 'No special characters, please.'

View File

@@ -18,7 +18,7 @@ class CreateUsers < ActiveRecord::Migration
t.boolean :confirmed, default: false
t.datetime :last_seen
t.references :role, null: false
t.references :role, null: false, default: Role.get(:normal)
t.timestamps
end

View File

@@ -109,9 +109,9 @@ ActiveRecord::Schema.define(version: 11) do
t.string "email_token"
t.boolean "confirmed", default: false
t.datetime "last_seen"
t.integer "role_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "role_id", default: 3, null: false
t.datetime "created_at"
t.datetime "updated_at"
end
end

View File

@@ -18,7 +18,7 @@ deleted_user = User.create!(
uuid: "8667ba71b85a4004af54457a9734eed7",
name: "Deleted user",
email: "redstonerserver@gmail.com",
ign: "Steve",
ign: "Notch", # just need any valid ign here, overriding later
about: "Hey, apparently, I do no longer exist. This is just a placeholder profile",
password: userpw,
password_confirmation: userpw,

View File

@@ -1,13 +0,0 @@
<%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
<%%= f.error_notification %>
<div class="form-inputs">
<%- attributes.each do |attribute| -%>
<%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
<%- end -%>
</div>
<div class="form-actions">
<%%= f.button :submit %>
</div>
<%% end %>

1
pp.svg Normal file
View File

@@ -0,0 +1 @@
<svg viewBox="0 0 16 17" version="1.1" xmlns="http://www.w3.org/2000/svg" class="PPTM"><path d="m15.603 3.917c-0.264-0.505-0.651-0.917-1.155-1.231-0.025-0.016-0.055-0.029-0.081-0.044 0.004 0.007 0.009 0.014 0.013 0.021 0.265 0.506 0.396 1.135 0.396 1.891 0 1.715-0.712 3.097-2.138 4.148-1.425 1.052-3.418 1.574-5.979 1.574h-0.597c-0.45 0-0.9 0.359-1.001 0.798l-0.719 3.106c-0.101 0.438-0.552 0.797-1.002 0.797h-1.404l-0.105 0.457c-0.101 0.438 0.184 0.798 0.633 0.798h2.1c0.45 0 0.9-0.359 1.001-0.798l0.718-3.106c0.101-0.438 0.551-0.797 1.002-0.797h0.597c2.562 0 4.554-0.522 5.979-1.574 1.426-1.052 2.139-2.434 2.139-4.149 0-0.755-0.132-1.385-0.397-1.891z" fill="#0079c1" class="PPTM-btm"/><path d="m9.27 6.283c-0.63 0.46-1.511 0.691-2.641 0.691h-0.521c-0.45 0-0.736-0.359-0.635-0.797l0.628-2.72c0.101-0.438 0.552-0.797 1.002-0.797h0.686c0.802 0 1.408 0.136 1.814 0.409 0.409 0.268 0.611 0.683 0.611 1.244 0 0.852-0.315 1.507-0.944 1.97zm3.369-5.42c-0.913-0.566-2.16-0.863-4.288-0.863h-4.372c-0.449 0-0.9 0.359-1.001 0.797l-2.957 12.813c-0.101 0.439 0.185 0.798 0.634 0.798h2.099c0.45 0 0.901-0.358 1.003-0.797l0.717-3.105c0.101-0.438 0.552-0.797 1.001-0.797h0.598c2.562 0 4.554-0.524 5.979-1.575 1.427-1.051 2.139-2.433 2.139-4.148-0.001-1.365-0.439-2.425-1.552-3.123z" fill="#00457c" class="PPTM-top"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,19 @@
class RegistrationPreview < ActionMailer::Preview
@@user = User.new(id: 123, uuid: "aabbccddeeff11223344556677889900", ign: "fancy_user", name: "fancy_user", email_token: "abcdefg", email: "fancymail@example.com", created_at: Time.now, last_ip: "1.2.3.4")
def register_mail_normal
RedstonerMailer.register_mail(@@user, false)
end
def register_mail_idiot
RedstonerMailer.register_mail(@@user, true)
end
def register_info_mail_normal
RedstonerMailer.register_info_mail(@@user, false)
end
def register_info_mail_idiot
RedstonerMailer.register_info_mail(@@user, true)
end
end