From 5fac505a31e6fdaf108ac29cf927ec097c925632 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 7 Oct 2013 04:59:21 +0200 Subject: [PATCH] another big commit :D --- Gemfile | 6 +- Gemfile.lock | 14 +- app/assets/images/bg.png | Bin 1495 -> 9018 bytes app/assets/images/bg1_noise.png | Bin 0 -> 63308 bytes app/assets/images/{bg2.png => bg2_black.png} | Bin app/assets/images/bg_white.png | Bin 0 -> 1495 bytes app/assets/images/logo.png | Bin 19253 -> 19645 bytes app/assets/javascripts/app.js | 29 +++- app/assets/javascripts/application.js | 4 +- app/assets/stylesheets/mobi.css.scss | 9 +- app/assets/stylesheets/screen.css.scss | 103 ++++++++------ app/assets/stylesheets/style.css.scss | 3 - app/controllers/application_controller.rb | 42 +++++- app/controllers/blogposts_controller.rb | 15 ++- app/controllers/comments_controller.rb | 25 ++-- app/controllers/forumgroups_controller.rb | 5 +- app/controllers/forums_controller.rb | 11 +- app/controllers/forumthreads_controller.rb | 6 + app/controllers/paypal_controller.rb | 4 +- app/controllers/serverchecker_controller.rb | 10 -- app/controllers/sessions_controller.rb | 40 ++++-- app/controllers/status_controller.rb | 21 +++ app/controllers/users_controller.rb | 126 ++++++++++++------ app/helpers/application_helper.rb | 15 +++ app/helpers/users_helper.rb | 78 +++++++---- app/mailers/redstoner_mailer.rb | 17 +++ app/models/blogpost.rb | 15 ++- app/models/comment.rb | 17 ++- app/models/forum.rb | 9 ++ app/models/forumgroup.rb | 4 + app/models/forumthread.rb | 9 ++ app/models/role.rb | 38 ++++++ app/models/user.rb | 93 ++++++++++++- app/views/blogposts/edit.html.erb | 4 +- app/views/blogposts/index.html.erb | 6 +- app/views/blogposts/new.html.erb | 2 +- app/views/blogposts/show.html.erb | 4 +- app/views/comments/_comment.html.erb | 8 +- app/views/comments/_new.html.erb | 2 +- app/views/comments/edit.html.erb | 9 +- app/views/forumgroups/index.html.erb | 10 +- app/views/forums/show.html.erb | 20 +++ app/views/layouts/_head.html.erb | 19 ++- app/views/layouts/application.html.erb | 14 +- .../register_info_mail.html.erb | 29 ++++ .../redstoner_mailer/register_mail.html.erb | 29 ++++ app/views/sessions/new.html.erb | 1 + app/views/users/edit.html.erb | 51 ++++--- app/views/users/index.html.erb | 4 +- app/views/users/new.html.erb | 4 +- app/views/users/show.html.erb | 46 ++++--- config/initializers/session_store.rb | 4 +- config/routes.rb | 18 ++- db/migrate/00000000000001_create_roles.rb | 11 ++ db/migrate/00000000000002_create_users.rb | 23 ++++ ....rb => 00000000000003_create_blogposts.rb} | 8 +- ...s.rb => 00000000000004_create_comments.rb} | 6 +- .../00000000000005_create_forumgroups.rb | 10 ++ ...ums.rb => 00000000000006_create_forums.rb} | 9 +- .../00000000000007_create_forumthreads.rb | 17 +++ db/migrate/20130518221216_create_users.rb | 20 --- .../20130727063752_add_youtube_to_users.rb | 5 - .../20130727071804_add_youtube_channelname.rb | 8 -- .../20130728003021_add_twitter_to_users.rb | 5 - db/migrate/20130802051129_add_forumgroups.rb | 9 -- .../20130922181339_add_sessions_table.rb | 12 ++ db/schema.rb | 82 ++++++++---- db/seeds.rb | 40 +++++- rcon_test | Bin 0 -> 18 bytes test/fixtures/forumthreads.yml | 11 ++ test/fixtures/permissions.yml | 11 ++ test/functional/redstoner_mailer_test.rb | 7 + test/unit/forumthread_test.rb | 7 + test/unit/permission_test.rb | 7 + 74 files changed, 1003 insertions(+), 357 deletions(-) create mode 100644 app/assets/images/bg1_noise.png rename app/assets/images/{bg2.png => bg2_black.png} (100%) create mode 100644 app/assets/images/bg_white.png create mode 100644 app/controllers/forumthreads_controller.rb delete mode 100644 app/controllers/serverchecker_controller.rb create mode 100644 app/controllers/status_controller.rb create mode 100644 app/mailers/redstoner_mailer.rb create mode 100644 app/models/forumthread.rb create mode 100644 app/models/role.rb create mode 100644 app/views/forums/show.html.erb create mode 100644 app/views/redstoner_mailer/register_info_mail.html.erb create mode 100644 app/views/redstoner_mailer/register_mail.html.erb create mode 100644 db/migrate/00000000000001_create_roles.rb create mode 100644 db/migrate/00000000000002_create_users.rb rename db/migrate/{20130526015928_create_blogposts.rb => 00000000000003_create_blogposts.rb} (62%) rename db/migrate/{20130526020734_create_comments.rb => 00000000000004_create_comments.rb} (64%) create mode 100644 db/migrate/00000000000005_create_forumgroups.rb rename db/migrate/{20130802051521_create_forums.rb => 00000000000006_create_forums.rb} (55%) create mode 100644 db/migrate/00000000000007_create_forumthreads.rb delete mode 100644 db/migrate/20130518221216_create_users.rb delete mode 100644 db/migrate/20130727063752_add_youtube_to_users.rb delete mode 100644 db/migrate/20130727071804_add_youtube_channelname.rb delete mode 100644 db/migrate/20130728003021_add_twitter_to_users.rb delete mode 100644 db/migrate/20130802051129_add_forumgroups.rb create mode 100644 db/migrate/20130922181339_add_sessions_table.rb create mode 100644 rcon_test create mode 100644 test/fixtures/forumthreads.yml create mode 100644 test/fixtures/permissions.yml create mode 100644 test/functional/redstoner_mailer_test.rb create mode 100644 test/unit/forumthread_test.rb create mode 100644 test/unit/permission_test.rb diff --git a/Gemfile b/Gemfile index 18434a7..0d852c0 100644 --- a/Gemfile +++ b/Gemfile @@ -10,7 +10,10 @@ gem 'jquery-rails' gem 'therubyracer' gem 'bcrypt-ruby', '~> 3.0.0' # To use ActiveModel has_secure_password gem 'simple_form' -gem 'rbbcode' +gem 'sanitize' +gem 'github-markdown' +gem 'hirb' #pretty console output +gem 'rb-readline' # Gems used only for assets and not required # in production environments by default. @@ -25,6 +28,7 @@ group :assets do end group :development do + gem 'webrick' gem 'better_errors' gem 'binding_of_caller' end diff --git a/Gemfile.lock b/Gemfile.lock index 30f44e2..da02402 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -48,7 +48,9 @@ GEM erubis (2.7.0) execjs (1.4.0) multi_json (~> 1.0) + github-markdown (0.5.5) hike (1.2.2) + hirb (0.7.1) i18n (0.6.4) journey (1.0.4) jquery-rails (2.2.1) @@ -87,15 +89,12 @@ GEM rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) rake (10.0.4) - rbbcode (1.0.3) - sanitize - treetop + rb-readline (0.5.0) rdoc (3.12.2) json (~> 1.4) ref (1.0.4) sanitize (2.0.3) nokogiri (>= 1.4.4, < 1.6) - nokogiri (>= 1.4.4, < 1.6) sass (3.2.9) sass-rails (3.2.6) railties (~> 3.2.0) @@ -122,6 +121,7 @@ GEM uglifier (2.1.1) execjs (>= 0.3.0) multi_json (~> 1.0, >= 1.0.2) + webrick (1.3.1) PLATFORMS ruby @@ -131,11 +131,15 @@ DEPENDENCIES better_errors binding_of_caller coffee-rails (~> 3.2.1) + github-markdown + hirb jquery-rails rails (= 3.2.12) - rbbcode + rb-readline + sanitize sass-rails (~> 3.2.3) simple_form sqlite3 therubyracer uglifier (>= 1.0.3) + webrick diff --git a/app/assets/images/bg.png b/app/assets/images/bg.png index 46b806684c46a611e0ed91b247c96f4bb823a7cd..130fa4deac922ed1fca08c6b1c298a600d22ec15 100644 GIT binary patch literal 9018 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_to7(87ZLn`8O@3v2pJu1|a zsOxti`N7@a_EK^sU(4T^PyBM#O(6aJ46{_D%~@$jPwVgh^Xc8+^Rw^Q|NrZ2udlEF ze1E_FzaM8o{AZW_?Q1`uxBtKA=lA>d_xIHP{#H}><)ZuZU;cJKpVYkHoV{yX^{(xP z|NneGZ=ANj{^L>c=deO~?i_uj%=kDt%4ud}QF{dW82?bj~E?K-w=_p+T)^{)$R=YPw;x6i!H zte}4W-2b0W>;KPRAA9}ln`?jd@7I36yW6j%`JmNBe)YNB_w^Orx4aO$_Vw=d6xsJR z_H&anxHn(mIkE8W^NR1KYYU~cmA}kf80G#vD*k)=l6B$+Oh;z1h`N8>`*W6k^7or| zEPiY+XWd<2`&Mq(Ik{N<3l_WHGr1?^2HbE?7Ufvm_%`bLX@2`ZAJ*~aibU|}Z`YXp zuuxFxmd}NsJlCFCO`m9#wBNk)v&sB3n;naP-22MZxNz705BrzGYa*x7s4(D9>CN@swuS>U|9 z!k+7DIRZxvv(9B*uyf7ke)XLvvDxh9=Hg!MN3pk;8QDDFsyE@{`yK^h^GB(Za;D4H z=F2f&UH&`O^!O>KiG1f+BEFwW`0Ut!?qrr*zP=3Ovy?7|?E2VZnM+J&Q8oF@8}@R> zUhXw&p1kDlvVBJ-*H=p{dhKG-@p5GitGj&L^>6pe z3zGGZ^!TtxyKv6e@i?rXT3(!L;KsZcACz9tM)va;~UX)R=G4r+3Dk%q-Du> zx&6#ScZY59`YEOr6;`XW$Iv1Bp+d1K-|;4;`v;xaL>*SMrA{tP<#OlRx3BrMsK~Wm zb&ftJ?l;_W8`x8$>{~MSwqFTfr}*4Xy#4pN&8yp@eEy4OT5_)`WVzF}JA}3UaO9Re*&-D-JHg8R7(cg1bre9N1qpjEOTC~gK&%W-kgO_(ad)RO-w=Poa@jSHA9D+rc{V2vgs!hC{K}ZvJRD7H!k@ zD4lch?u8?~ITK@@V?|8ova|D?{jjLObK}v6OcS@bO3i6I&f=P_ar;BlnvmGkb&csD5I`fDAl(|dbEy4{R! z+g{tK)qQYV+QSX+7F%f=6fbOKV%j3?r@*7SW=7@DXS4JDWG_A2c3wH?s-(f(oXKt8 zI~10)u5T&H<(`=N#eVUHr%E9q4;3W(5(>Ltf0PkTx$Ax8no7aDMN^!oeRlAAJ}bM@ zPb_ls-W#(&ZlAYn<-$VN1DriFhaSr-m0$fdNovM~O-9e1rrMO9f{qeK= z4(9g?J!G0Xrt6zXyCyu}V&cGeI550GK7B&_6%NZ4r?sk#S(x5OoD*8xd+@|9OC_1| zR1Kj`uRn68-*Iv|d!;s(+e%9O%Y^5@LVG9ro+>zaGLA{)%%ezwt23s|DExYY$(?&;@oR~4?xauh%XgJuWY|(9#pv)MXZO<;Yu4}k_3DbE$f0GEPUHk+ zxqeyaxMb7WAZP9QyZQf2Ts_%y&0hF}i%4^kQxNL-ieR1ozt=&6#jCT4i2{&aDFnKid#_bj4ZbnoP>y$r&jF`;5gwMvQqlRw>if=H$-mrc2vlV+`j6l;koFHiLNK2 zZdWgKI2Fyl<)>V0_H!qC2!cu&A23P@uy!`rYo0+A1u;x=ibJC z>6AdGR_>O-s0#a4u_<1a2l9==r!)$+Ej0)ed&l-*#Yfk^j3f=EgxA~?_uomH%n@9B z>A6=?&^G^7r!0OrUf?t`oi?p^8hi9fv%N-+TeXbTAE^ZBHpK1w_v`gz0b!$6tqSM-e+7IP0gmg$&mBQn;X4yb+SYMzM#hjY-^U! zO8Io}uwiz^G^o?+8pl4u#epH*ih)1 zec{>j-5SErH>Ai%Wb<7QY6+Ri$M|)5jR1qb{r^9oE0Z|X zwiO;@nESqMt?Mk2Es|?ob5y+r9*DJxs%}a)-Mh75%Cyq^UwdR0^9gP>>#f|?_t-`8 z)0^V!{;SIGREg< r9d`c_N5Y02w7GcH(+|Wsy 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 SP{_c*z~JfX=d#Wzp$Py%So$^q literal 1495 zcmeAS@N?(olHy`uVBq!ia0y~yU`PaE4kiW$2G5j;FANL}k|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg zxv3?I3Kh9IdBs*0wn|`gt@4VkK*IV;3ScEA*|tg$M@9GsC^+XAr7D=}8S5q+7#b>= znduptn3|ax>L?f)7#ist80j0B=^C0?nVMM{nJYknlAVH0QA(Oskc%7CuA-DQTcwPW zk^(Dz{qpj1y>er{{GxPyLrY6bkQqisxCgqow*eWSOjjhNn@b!fooL3ADsO0=y{ffi_eM3D1{oGuTzrY?YE(uCSI0LKd z;*iRMRQ;gT;{4L0Sp2Q=xStWXkp~yXyNE&X>8_b?qq0U0y6`fUPEJ7Cnr-w6E`PE zCqqM5BTEw#LnmWXR|^AIQzs*1N0?sEyyB9?yyR4vy_uOQR#3ghc=cL27o{eau$h8JcxGNoetEGbD0;wQZ{?C&lv$RV;#QQOs{jsPt4u8R z6ZSVmZwfhKrf;WUqYp|PNQng|6y)LtVuI5(D2>}GATm#CUW%t|k;l|7tDr(<&We*>@w$OOS4cih1VOHnMGgnAToprf+Ax2HBz0D}l z#$;mWuZ4v^TX@bUEy~Ui5bkvjp7BCf>Y&T-0DIxKg+*#A&S!lp+OlQ_@Rk}SN^7M! zSzI}$@^|k3u9Ls5>-mFc2MPo)59AV_x5xc-%c`cLdwchbe>B#t611GWRNTgGEC)Tle_`ctCruREW7>(V;@sG$Dgn&9 zUAMkwEZbFPJALJrSpL*idDn$!O5OTuv20$MZTHHxvHVG|a;^u@n05Or$FhHAch4`$ yxc<~6}6tOelF{r5}E+p;wl>e diff --git a/app/assets/images/bg1_noise.png b/app/assets/images/bg1_noise.png new file mode 100644 index 0000000000000000000000000000000000000000..c80c22895c991ef2a4da608c6573f839f52d5333 GIT binary patch literal 63308 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 b`})6lvGU>d56mq=M;&>(`njxgN@xNA{#SlK literal 0 HcmV?d00001 diff --git a/app/assets/images/bg2.png b/app/assets/images/bg2_black.png similarity index 100% rename from app/assets/images/bg2.png rename to app/assets/images/bg2_black.png diff --git a/app/assets/images/bg_white.png b/app/assets/images/bg_white.png new file mode 100644 index 0000000000000000000000000000000000000000..46b806684c46a611e0ed91b247c96f4bb823a7cd GIT binary patch literal 1495 zcmeAS@N?(olHy`uVBq!ia0y~yU`PaE4kiW$2G5j;FANL}k|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg zxv3?I3Kh9IdBs*0wn|`gt@4VkK*IV;3ScEA*|tg$M@9GsC^+XAr7D=}8S5q+7#b>= znduptn3|ax>L?f)7#ist80j0B=^C0?nVMM{nJYknlAVH0QA(Oskc%7CuA-DQTcwPW zk^(Dz{qpj1y>er{{GxPyLrY6bkQqisxCgqow*eWSOjjhNn@b!fooL3ADsO0=y{ffi_eM3D1{oGuTzrY?YE(uCSI0LKd z;*iRMRQ;gT;{4L0Sp2Q=xStWXkp~yXyNE&X>8_b?qq0U0y6`fUPEJ7Cnr-w6E`PE zCqqM5BTEw#LnmWXR|^AIQzs*1N0?sEyyB9?yyR4vy_uOQR#3ghc=cL27o{eau$h8JcxGNoetEGbD0;wQZ{?C&lv$RV;#QQOs{jsPt4u8R z6ZSVmZwfhKrf;WUqYp|PNQng|6y)LtVuI5(D2>}GATm#CUW%t|k;l|7tDr(<&We*>@w$OOS4cih1VOHnMGgnAToprf+Ax2HBz0D}l z#$;mWuZ4v^TX@bUEy~Ui5bkvjp7BCf>Y&T-0DIxKg+*#A&S!lp+OlQ_@Rk}SN^7M! zSzI}$@^|k3u9Ls5>-mFc2MPo)59AV_x5xc-%c`cLdwchbe>B#t611GWRNTgGEC)Tle_`ctCruREW7>(V;@sG$Dgn&9 zUAMkwEZbFPJALJrSpL*idDn$!O5OTuv20$MZTHHxvHVG|a;^u@n05Or$FhHAch4`$ yxc<~6}6tOelF{r5}E+p;wl>e literal 0 HcmV?d00001 diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png index 82df6d05d718d18975d320a7f6f15aa9d11eb9f2..f464350f6305b2b8729117052d06c7930adf4195 100644 GIT binary patch literal 19645 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%0D?*zo> zE%@ye`mxqEP3Uj;A#gvq_~+C3^(_BaJ+9xhE{}cEWr?TzW&Y})TGjetf5zQidgm&) zE%~UvFgbsEx41zuXodK$0}M~9Lp~bj8~sfFt)Kb_G!T)o=;%Vh<7as<{?^Exag;lJ zp|nXsxybEpy9+oxB&KH0y7$?2;qiO#YxA4G$E0wWylF3=Vv*7wK8@$AOz6?+ALBz( zoSZy1_xeA5Z&3C`UR~|oVP|%RWTT(vb>B9>4W9P(t=A*=llI4dp4%O)8N*`wa&_0y z$1mO`eU$WgW8i&M{ISwyd(l5_XJ_yJwC%6B@x%DiKj-~?-~RY?Z?F4=ImaA>csMk^ zE^6vmZ_)U-I(%Krs#fmX-ct25&oB69&;Co^;-AVdR*k<4o8pg%f3>gs{XR(cKWOtw zGpM!u-1A6dsR-M_pKXhb3zqQCdf(@9F7e>f>1iL&Icu2P8R*G)CDrWVd!O;q>r(i% z{&fcr?f?EYv-JM#XP*vzNd0s9j(D8uc~-k=`;Y#dxO~&i-T%wO#ow`+PV!tXJM&Mr z{(c#$$tVAZB)s__!esC9Pk7tj&(He!_RQXD^zw_uJ<}ggI@E0XW*ua<(q7f2KRaQ= zzm*TJo0uJ1I{)XH_~$vl)t`P?Zw1y>+|KvV!zIsP>Z!ng8~?3-^q94s>;F|>-?ys0 z`%}u@-qvsXYTs3F^>68e;C(CpAGE)2VwM(qe1BEZCO`izvuuQ}?%c5`OhYZ~*P?ZL zO7~rP`IcGRIEIF9&)AnM(f0hwkz(J=ET>~j_13Pu=}NI||M+N4{qN&`{JOud&z*Ejzx7;oSAJMC?A;q2Tz;=-_{f$nnIlaw2r{Ubkn!5KFo;>NB z7xV6&@5?Xm|J%=mhb&^D(<9;wa#Jvu7(F2MJtV-L>&Io-?yLZ|EeF&E3dqe z-}~oNuz5*Ij?}5=@){QBCTi5&{P8^Z_ld~URS(+w`h5TYyBcn-S|r8$X#V7^MA1J= zT@UOxrf?n+*Ut-=tIuMeboxR1;eR2=H8u7=TAiJUA@r%hbQ=JXFguM ze92GGlYM*(!?UMyukctd*4M?cXVtmY>t6M}y?uP0|MKZf2M%3eFDvPIFU0rU@(oY! z?X0@PkXM)cm z{yy1i76!S>AK&Zpoi8tPU8{B=mGf}KVT=0$-A7+ZBwsGyYh;#Wc}`HQySK;JcWV>oZ3;h^tY5D)x z(&=SP2hQ!^_iUEwb)BdZ@2#0}V(B@)JsWx360dYVR^Ilw$AZCKjl1<8({uIv7WH-S z<7I4bNt@I)ue_pRC*=OIaN)$q7CK_xny(`?KdsNp+Vx$y{`dCpj0awwV1IuNUFZX^ z_fWn3Y1_6SyEu)9n?qIYem5V>UYfaUQ^hXL?yCly%O%@h9@F#w|L5!Veue`Rx%S*P zVDQ;9-zdvNO?%%0#s*D>761P)Q$OpT_QU4%)Zjd`ry<8S>wfpXx!t_xK+fh#W>Jge zrarm+r7!Gq%mo&PE82D2Zt-rlkax1Q%*(h@C|kR4%G3hRz$MI($ zEqr&xJNb1Q&70_6^lL$oUQzn8OuyP$^D>^>e?4=lcrBOh?&r=bn{Up$;C^>~%WIBD z>w47>%nx2Px&GYWpNEyM8-72{(h$XJ8Tl?Royn#8DE~H{w!7bD!LG zI^)-cfVw`lbKP@w$`coPUS2b4oz=A^;1hr_PXfB+;_*D=xuD^(k|gkHL|SOENYr^g4ZXD(~jpYLC_PL5?_Ee@OVm z(#<=%Pct5v*&X8M&5&?W$8P@t%lDU8tpIuT^W>fe&+y69x= rank_to_int("mod")) + !!(current_user && current_user.mod?) end def admin? - !!(current_user && current_user.rank >= rank_to_int("admin")) + !!(current_user && current_user.admin?) end def superadmin? - !!(current_user && current_user.rank >= rank_to_int("superadmin")) + !!(current_user && current_user.superadmin?) end end \ No newline at end of file diff --git a/app/controllers/blogposts_controller.rb b/app/controllers/blogposts_controller.rb index a88d93c..d3a0bde 100644 --- a/app/controllers/blogposts_controller.rb +++ b/app/controllers/blogposts_controller.rb @@ -10,7 +10,7 @@ class BlogpostsController < ApplicationController end def new - if current_user && current_user.rank >= rank_to_int("mod") + if mod? @post = Blogpost.new else flash[:alert] = "You are not allowed to create a new post!" @@ -20,19 +20,21 @@ class BlogpostsController < ApplicationController def edit @post = Blogpost.find(params[:id]) - if current_user && ((current_user.rank >= rank_to_int("mod") && current_user.rank.to_i >= @post.user.rank.to_i) || (current_user == @edit.user)) + if mod? else - flash[:alert] = "You are not allowed to update this post!" + flash[:alert] = "You are not allowed to edit this post!" + redirect_to @post end end def create if mod? @post = Blogpost.new(params[:blogpost]) - @post.user = current_user + @post.user_author = current_user if @post.save redirect_to @post, notice: 'Post has been created.' else + flash[:alert] = @post.errors.first render action: "new" end else @@ -43,11 +45,12 @@ class BlogpostsController < ApplicationController def update @post = Blogpost.find(params[:id]) - if current_user && ((current_user.rank >= rank_to_int("mod") && current_user.rank.to_i >= @post.user.rank.to_i) || (current_user == @post.user)) + if mod? if @post.update_attributes(params[:blogpost]) redirect_to @post, notice: 'Post has been updated.' else flash[:alert] = "There was a problem while updating the post" + raise @post.errors render action: "edit" end end @@ -55,7 +58,7 @@ class BlogpostsController < ApplicationController def destroy @post = Blogpost.find(params[:id]) - if current_user && ((current_user.rank >= rank_to_int("mod") && current_user.rank.to_i >= @post.user.rank.to_i) || (current_user == @post.user)) + if mod? if @post.destroy flash[:notice] = "Post deleted!" else diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 906d9c6..68a229b 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -2,8 +2,7 @@ class CommentsController < ApplicationController def edit @comment = Comment.find(params[:id]) - if current_user && ((current_user.rank >= rank_to_int("mod") && current_user.rank.to_i >= @comment.user.rank.to_i) || (current_user == @comment.user)) - session[:return_to] = blogpost_path(@comment.blogpost) + if mod? || @comment.author.is?(current_user) else flash[:alert] = "You are not allowed to edit this comment" redirect_to @comment.blogpost @@ -11,39 +10,43 @@ class CommentsController < ApplicationController end def create - if current_user + if confirmed? + params[:comment].slice!("content") if params[:comment] @comment = Comment.new(params[:comment]) - @comment.user_id = current_user.id + @comment.user_author = current_user @comment.blogpost = Blogpost.find(params[:blogpost_id]) if @comment.save redirect_to @comment.blogpost, notice: 'Comment created!' else - flash[:alert] = @comment.errors.full_messages.first - redirect_to blogpost_path(params[:blogpost_id]) + flash[:alert] = "Could not create comment." + redirect_to Blogpost.find(params[:blogpost_id]) end + else + flash[:alert] = "You are not allowed to create comments." + redirect_to Blogpost.find(params[:blogpost_id]) end end def update @comment = Comment.find(params[:id]) - if current_user && ((current_user.rank >= rank_to_int("mod") && current_user.rank.to_i >= @comment.user.rank.to_i) || (current_user == @comment.user)) + if mod? || @comment.author.is?(current_user) + params[:comment].slice!("content") if params[:comment] if @comment.update_attributes(params[:comment]) flash[:notice] = "Comment updated!" redirect_to @comment.blogpost else flash[:alert] = "There was a problem while updating your comment" - redirect_to session[:return_to] - session.delete(:redirect_to) + render action: "edit" end else flash[:alert] = "You are not allowed to edit this comment" - redirect_to blogpost_path(params[:blogpost_id]) + redirect_to @comment.blogpost end end def destroy @comment = Comment.find(params[:id]) - if current_user && ((current_user.rank >= rank_to_int("mod") && current_user.rank.to_i >= @comment.user.rank.to_i) || (current_user == @comment.user)) + if mod? || @comment.author.is?(current_user) if @comment.destroy flash[:notice] = "Comment deleted!" else diff --git a/app/controllers/forumgroups_controller.rb b/app/controllers/forumgroups_controller.rb index 208d408..4f41a7f 100644 --- a/app/controllers/forumgroups_controller.rb +++ b/app/controllers/forumgroups_controller.rb @@ -1,6 +1,9 @@ class ForumgroupsController < ApplicationController - def index @groups = Forumgroup.all.sort_by{|s| s[:position]} end + + def show + redirect_to forumgroups_path + "#forum-#{params[:id]}" + end end \ No newline at end of file diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb index 82573fd..d7242cd 100644 --- a/app/controllers/forums_controller.rb +++ b/app/controllers/forums_controller.rb @@ -1,2 +1,11 @@ class ForumsController < ApplicationController -end + def index + redirect_to :forumgroups + end + + def show + @forum = Forum.find(params[:id]) + @threads = @forum.forumthreads + end + +end \ No newline at end of file diff --git a/app/controllers/forumthreads_controller.rb b/app/controllers/forumthreads_controller.rb new file mode 100644 index 0000000..27e2bb7 --- /dev/null +++ b/app/controllers/forumthreads_controller.rb @@ -0,0 +1,6 @@ +class ForumthreadsController < ApplicationController + def index + f = Forum.find(params[:id]) + redirect_to forum_path(f.forumgroup, f) + end +end \ No newline at end of file diff --git a/app/controllers/paypal_controller.rb b/app/controllers/paypal_controller.rb index 6fc50f9..48ffa83 100644 --- a/app/controllers/paypal_controller.rb +++ b/app/controllers/paypal_controller.rb @@ -19,7 +19,7 @@ class PaypalController < ApplicationController end - protected + protected def validate_IPN_notification(raw) uri = URI.parse('https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate') http = Net::HTTP.new(uri.host, uri.port) @@ -29,7 +29,7 @@ class PaypalController < ApplicationController http.use_ssl = true response = http.post(uri.request_uri, raw, 'Content-Length' => "#{raw.size}", - 'User-Agent' => "Redstoner.com" + 'User-Agent' => "RedstonerServer, redstoner.com" ).body end end \ No newline at end of file diff --git a/app/controllers/serverchecker_controller.rb b/app/controllers/serverchecker_controller.rb deleted file mode 100644 index 30d510d..0000000 --- a/app/controllers/serverchecker_controller.rb +++ /dev/null @@ -1,10 +0,0 @@ -class ServercheckerController < ApplicationController - def show - - if mc_running? - send_file "app/assets/images/on.png", :type => "image/png", :disposition => "inline" - else - send_file "app/assets/images/off.png", :type => "image/png", :disposition => "inline" - end - end -end \ No newline at end of file diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index f3b15f7..3c12df4 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,21 +1,37 @@ class SessionsController < ApplicationController require 'resolv' + + def new + if current_user + redirect_to current_user + flash[:alert] = "You are already logged in!" + end + end + def create - user = User.find_by_email(params[:email]) - if user && user.authenticate(params[:password]) - user.last_ip = "#{request.remote_ip} | #{Resolv.getname(request.remote_ip)}" - user.last_login = Time.now - user.save - if user.banned - flash[:alert] = "You are banned!" - redirect_to user + unless current_user + user = User.find_by_email(params[:email]) + if user && user.authenticate(params[:password]) + user.last_ip = "#{request.remote_ip} | #{Resolv.getname(request.remote_ip)}" + user.last_login = Time.now + user.save + if user.disabled? + flash[:alert] = "This user has been disabled!" + redirect_to login_path + elsif user.banned? + flash[:alert] = "You are banned!" + redirect_to user + else + session[:user_id] = user.id + redirect_to root_path, :notice => "Logged in!" + end else - session[:user_id] = user.id - redirect_to root_path, :notice => "Logged in!" + flash[:alert] = "You're doing it wrong!" + redirect_to login_path end else - flash[:alert] = "You're doing it wrong!" - redirect_to login_path + redirect_to current_user + flash[:alert] = "You are already logged in!" end end diff --git a/app/controllers/status_controller.rb b/app/controllers/status_controller.rb new file mode 100644 index 0000000..1b726bc --- /dev/null +++ b/app/controllers/status_controller.rb @@ -0,0 +1,21 @@ +class StatusController < ApplicationController + def show + if params[:check] + if params[:check].downcase == "minecraft" + if port_open?("redstoner.com", 25565) + send_file "app/assets/images/on.png", :type => "image/png", :disposition => "inline" + else + send_file "app/assets/images/off.png", :type => "image/png", :disposition => "inline" + end + elsif params[:check].downcase == "teamspeak" + if port_open?("redstoner.com", 9987) + send_file "app/assets/images/on.png", :type => "image/png", :disposition => "inline" + else + send_file "app/assets/images/off.png", :type => "image/png", :disposition => "inline" + end + else + render :text => "invalid params" + end + end + end +end \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 25a981e..44e2e7f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,18 +3,23 @@ class UsersController < ApplicationController require 'open-uri' def index - if params[:rank] - @users = User.find_all_by_rank(rank_to_int(params[:rank])) + if params[:role] + if params[:role].downcase == "staff" + @users = User.all.select {|u| u.role >= Role.get(:mod) } + else + @users = User.find_all_by_role_id(Role.get(params[:role])) + end else @users = User.all + @users.shift() #Remove first user end end def show - @user = User.find(params[:id]) + @user = User.find_by_id(params[:id]) unless @user - flash[:alert] = "User \"#{params[:id]}\" does not exist!" - redirect_to User.find(1) + flash[:alert] = "User does not exist!" + redirect_to users_path end end @@ -22,15 +27,40 @@ require 'open-uri' def new if current_user flash[:notice] = "You are already signed up!" - redirect_to user_path(current_user.id) + redirect_to current_user else - @user = User.new + @user = User.new(role: Role.get(:unconfirmed)) + end + end + + def confirm + if current_user + @user = User.find(params[:id]) + code = params[:code] + if @user && @user == current_user && code && @user.confirm_code == code + if @user.role == Role.get(:unconfirmed) + @user.role = Role.get :default + @user.save + flash[:notice] = "Registration confirmed." + elsif @user.role < Role.get(:unconfirmed) + flash[:alert] = "Your account has been banned or removed" + else + flash[:alert] = "Your account has already been confirmed!" + end + redirect_to @user + else + flash[:alert] = "Something is wrong with your confirmation code" + redirect_to root_path + end + else + flash[:alert] = "Please login" + redirect_to login_path end end def edit @user = User.find(params[:id]) - unless (mod? && current_user.rank.to_i >= @user.rank.to_i) || current_user == @user + unless (mod? && current_user.role >= @user.role) || current_user == @user flash[:alert] = "You are not allowed to edit this user" redirect_to user_path(@user) end @@ -41,23 +71,29 @@ require 'open-uri' flash[:notice] = "You are already signed up!" redirect_to current_user else - @user = User.new(params[:user]) + @user = User.new(params[:user] ? params[:user].slice(:name, :ign, :email, :password, :password_confirmation) : {} ) + @user.role = Role.get :unconfirmed + @user.confirm_code = SecureRandom.hex(16) @user.last_ip = request.remote_ip @user.last_login = Time.now if @user.save session[:user_id] = @user.id - data = params[:user] - mclogin = "" + if uses_mc_password?(@user.ign, params[:user][:password]) + minecraftpw = true + flash[:alert] = "Really? That's your Minecraft password!" + end begin - #check if this user is an idiot and uses his mc password. - mclogin = open("https://login.minecraft.net/?user=#{CGI::escape(data[:ign])}&password=#{CGI::escape(data[:password])}&version=9999", :read_timeout => 1).read + RedstonerMailer.register_mail(@user, minecraftpw).deliver + RedstonerMailer.register_info_mail(@user, minecraftpw).deliver + puts rescue + puts "---" + puts "WARNING: registration mail failed for user #{@user.name}, #{@user.email}" + puts "---" + flash[:alert] = "Registration mail failed. Please contact us in-game." end - if mclogin.downcase.include?(data[:ign].downcase) - redirect_to "http://youareanidiot.org/" - else - redirect_to edit_user_path(@user), notice: 'Successfully signed up!' - end + flash[:notice] = "Successfully signed up! Check your email!" + redirect_to edit_user_path(@user) else flash[:alert] = "Something went wrong" render action: "new" @@ -67,38 +103,46 @@ require 'open-uri' def update @user = User.find(params[:id]) - if (mod? && current_user.rank >= @user.rank ) || current_user == @user - userdata = params[:user] - yt = userdata[:youtube] - if yt.blank? - userdata[:youtube] = nil - userdata[:youtube_channelname] = nil - else - channel = yt - begin - channel = JSON.parse(open("https://gdata.youtube.com/feeds/api/users/#{CGI::escape(yt)}?alt=json", :read_timeout => 1).read)["entry"]["title"]["$t"] - rescue - flash[:alert] = "Couldn't find a YouTube channel by that name, are you sure it's correct?" + if (mod? && current_user.role >= @user.role ) || (@user.is?(current_user) && confirmed?) + userdata = params[:user] ? params[:user].slice(:name, :ign, :role, :skype, :skype_public, :youtube, :twitter, :about, :password, :password_confirmation) : {} + if userdata[:role] + role = Role.find(userdata[:role]) + if (mod? && role <= current_user.role) + userdata[:role] = role + else + #reset role + userdata[:role] = @user.role end - userdata[:youtube_channelname] = channel + end + unless userdata[:ign] && (mod? && current_user.role >= @user.role) + #reset ign + userdata[:ign] = @user.ign + end + if @user.youtube != userdata[:youtube] + youtube = get_youtube(userdata[:youtube]) + userdata[:youtube] = youtube[:channel] + userdata[:youtube_channelname] = youtube[:channel_name] + flash[:alert] = "Couldn't find a YouTube channel by that name, are you sure it's correct?" unless youtube[:is_correct?] end if @user.update_attributes(userdata) - redirect_to @user, notice: 'Profile updated.' + flash[:notice] = 'Profile updated.' else + raise @user.errors.inspect flash[:alert] = "There was a problem while updating the profile" render action: "edit" + return end else flash[:alert] = "You are not allowed to edit this user" - redirect_to @user end + redirect_to @user end def ban @user = User.find(params[:id]) - if mod? && current_user.rank >= @user.rank - @user.banned = true - flash[:notice] = "\"#{@user.name}\" has been banned!" + if mod? && current_user.role >= @user.role + @user.role = Role.get :banned + flash[:notice] = "'#{@user.name}' has been banned!" else flash[:alert] = "You are not allowed to ban this user!" end @@ -107,8 +151,8 @@ require 'open-uri' def unban @user = User.find(params[:id]) - if mod? && current_user.rank >= @user.rank - @user.banned = false + if mod? && current_user.role >= @user.role + @user.role = Role.get :default flash[:notice] = "\"#{@user.name}\" has been unbanned!" else flash[:alert] = "You are not allowed to unban this user!" @@ -135,7 +179,7 @@ require 'open-uri' def become original_user = current_user new_user = User.find(params[:id]) - if admin? && current_user.rank.to_i >= new_user.rank.to_i + if admin? && current_user.role >= new_user.role if original_user == new_user flash[:alert] = "You are already \"#{new_user.name}\"!" else @@ -154,10 +198,10 @@ require 'open-uri' def unbecome old_user = current_user original_user = User.find(session[:original_user_id]) - if old_user && original_user + if old_user && original_user && original_user.admin? session.delete(:original_user_id) session[:user_id] = original_user.id - flash[:notice] = "You are no longer \"#{old_user.name}\"!" + flash[:notice] = "You are no longer '#{old_user.name}'!" end redirect_to old_user end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 3a2b877..01c328a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,17 @@ module ApplicationHelper + def port_open?(host, port) + wait = 300/1000.0 #milliseconds, the .0 is required!! + require 'timeout' + require 'socket' + isopen = false + begin + Timeout::timeout(wait) { + TCPSocket.new host, port + isopen = true + } + rescue Exception + # could not connect to the server + end + return isopen + end end \ No newline at end of file diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 6bf993e..8e03766 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -1,39 +1,71 @@ module UsersHelper +require "open-uri" + def avatar_url(user_id, size) u = User.find_by_id(user_id) u.nil? ? ign = :char : ign = u.ign - return "https://minotar.net/helm/#{ign}/#{size}" + return "https://minotar.net/helm/#{CGI.escape(ign)}/#{CGI.escape(size.to_s)}" end - def mc_running? - host = "play.redstoner.com" - port = 25565 - wait = 300/1000.0 #milliseconds, the .0 is required!! - require 'timeout' - require 'socket' - r = false + def uses_mc_password?(ign, password) + query = { + user: ign, + password: password, + version: 9999 #just something high so it won't fail with "Old version" + }.to_query begin - Timeout::timeout(wait) { - TCPSocket.new host, port - r = true - } - rescue Exception - # could not connect to the server + #check if this user is an idiot and uses their mc password. + mclogin = open("https://login.minecraft.net/?#{query}", :read_timeout => 1).read + rescue + puts "---" + puts "ERROR: failed to check mc password for '#{ign}'. Login servers down?" + puts "---" end - return r + !!mclogin.downcase.include?(ign.downcase) end - def rank_to_int(rank) - r = ranks[rank] + def haspaid?(ign) + query = {user: ign}.to_query + begin + response = open("https://minecraft.net/haspaid.jsp?#{query}", :read_timeout => 1).read + rescue + puts "---" + puts "ERROR: failed to check for premium account for '#{ign}'. Minecraft servers down?" + puts "---" + response = "true" + end + !(response.casecmp("false") == 0) end - def int_to_rank(int) - r = ranks.rassoc(int) - r.nil? ? "unknown" : r[0].to_s + def correct_case?(ign) + begin + http = Net::HTTP.start("skins.minecraft.net") + skin = http.get("/MinecraftSkins/#{CGI.escape(ign)}.png") + http.finish + rescue + puts "---" + puts "ERROR: failed to get skin status code for '#{ign}'. Skin servers down?" + puts "---" + end + skin.code != "404" end - def ranks - # Lower case !!! - {"banned" => 1, "unconfirmed" => 5, "default" => 10, "donor" => 40, "mod" => 100, "admin" => 200, "superadmin" => 500} + def get_youtube(yt_name) + yt = {channel: yt_name} + if yt_name.blank? + yt[:channel] = nil + yt[:channel_name] = nil + yt[:is_correct?] = true + else + begin + yt[:channel_name] = JSON.parse(open("https://gdata.youtube.com/feeds/api/users/#{CGI.escape(yt_name)}?alt=json", :read_timeout => 1).read)["entry"]["title"]["$t"] + yt[:is_correct?] = true + rescue + yt[:is_correct?] = false + end + end + yt end + + end \ No newline at end of file diff --git a/app/mailers/redstoner_mailer.rb b/app/mailers/redstoner_mailer.rb new file mode 100644 index 0000000..d987f8b --- /dev/null +++ b/app/mailers/redstoner_mailer.rb @@ -0,0 +1,17 @@ +class RedstonerMailer < ActionMailer::Base + + default from: "info@redstoner.com" + default reply_to: "redstonerserver@gmail.com" + + 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@gmail.com") + end + + 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@gmail.com") + end +end \ No newline at end of file diff --git a/app/models/blogpost.rb b/app/models/blogpost.rb index f35a119..04cd57d 100644 --- a/app/models/blogpost.rb +++ b/app/models/blogpost.rb @@ -1,15 +1,16 @@ class Blogpost < ActiveRecord::Base - attr_accessible :title, :text - validates_presence_of :title, :text, :user - belongs_to :user - has_many :comments + attr_accessible :title, :content, :author, :editor + validates_presence_of :title, :content, :author + belongs_to :user_author, class_name: "User", foreign_key: "user_author_id" + belongs_to :user_editor, class_name: "User", foreign_key: "user_editor_id" + has_many :comments, :dependent => :destroy accepts_nested_attributes_for :comments def author - @author ||= if user.present? - user + @author ||= if self.user_author.present? + user_author else - User.find_by_name("Deleted user") + User.first end end end diff --git a/app/models/comment.rb b/app/models/comment.rb index d410f7f..fb6265b 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,10 +1,17 @@ class Comment < ActiveRecord::Base - attr_accessible :text, :user, :blogpost, :post - - validates_presence_of :text, :user, :blogpost - validates_length_of :text, :in => 4..1000 + attr_accessible :content, :author, :blogpost, :post + validates_presence_of :content, :author, :blogpost + validates_length_of :content, in: 4..1000 belongs_to :blogpost - belongs_to :user + belongs_to :user_author, class_name: "User", foreign_key: "user_author_id" + + def author + @author ||= if self.user_author.present? + user_author + else + User.first + end + end end \ No newline at end of file diff --git a/app/models/forum.rb b/app/models/forum.rb index 9805c64..5011c4c 100644 --- a/app/models/forum.rb +++ b/app/models/forum.rb @@ -1,3 +1,12 @@ class Forum < ActiveRecord::Base belongs_to :forumgroup + has_many :forumthreads + + def to_s + name + end + + def group + forumgroup + end end diff --git a/app/models/forumgroup.rb b/app/models/forumgroup.rb index a3ca2a4..daca97b 100644 --- a/app/models/forumgroup.rb +++ b/app/models/forumgroup.rb @@ -1,3 +1,7 @@ class Forumgroup < ActiveRecord::Base has_many :forums + + def to_s + name + end end diff --git a/app/models/forumthread.rb b/app/models/forumthread.rb new file mode 100644 index 0000000..d56c700 --- /dev/null +++ b/app/models/forumthread.rb @@ -0,0 +1,9 @@ +class Forumthread < ActiveRecord::Base + belongs_to :forum + belongs_to :user_author, class_name: "User", foreign_key: "user_author_id" + belongs_to :user_editor, class_name: "User", foreign_key: "user_editor_id" + + def to_s + name + end +end \ No newline at end of file diff --git a/app/models/role.rb b/app/models/role.rb new file mode 100644 index 0000000..a01f301 --- /dev/null +++ b/app/models/role.rb @@ -0,0 +1,38 @@ +class Role < ActiveRecord::Base + include Comparable + has_many :users + attr_accessible :name, :value + + def to_s + self.name + end + + def to_i + self.value + end + + def is? (name) + !!(Role.find_by_name(name) == self) + end + + def self.get (name) + Role.find_by_name(name) + end + + def <=> (role) + if role.is_a?(Role) + self.value - role.value + elsif role.is_a?(Symbol) + self <=> Role.find_by_name(role) + else + raise "Cannot compare Role with #{role.class}" + end + end + + def self.all_until (role) + Role.all.select do |r| + r <= role + end + end + +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index e3700fe..980e5f1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,12 +1,95 @@ class User < ActiveRecord::Base - attr_accessible :name, :ign, :email, :about, :password, :password_confirmation, :rank, :skype, :skype_public, :youtube, :youtube_channelname, :twitter + include UsersHelper + belongs_to :role + attr_accessible :name, :password, :password_confirmation, :ign, :email, :confirm_code, :about, :last_ip, :skype, :skype_public, :youtube, :youtube_channelname, :twitter, :last_login, :role + has_secure_password - validates_presence_of :password, :name, :email, :ign, :password_confirmation, :on => :create - validates :email, uniqueness: {case_sensitive: false} - validates :name, :uniqueness => true - validates :ign, :uniqueness => true + + before_validation :strip_whitespaces + + validates_presence_of :password, :password_confirmation, :confirm_code, :on => :create + validates_presence_of :name, :email, :ign + + validates_length_of :password, in: 8..256, :on => :create + validates_length_of :name, in: 3..20 + validates_length_of :about, maximum: 5000 + validates_length_of :ign, minimum: 2 + + validates :email, uniqueness: {case_sensitive: false}, format: {with: /^\S+@\S+\.[a-z]{2,}$/i, message: "That doesn't look like an email adress."} + validates :name, uniqueness: {case_sensitive: false}, format: {with: /^[a-z\d\-_ ]+$/i, message: "Allowed characters: a-z0-9, dashes, underscores and spaces"} + validates :ign, uniqueness: {case_sensitive: false}, format: {with: /^[a-z\d_]+$/i, message: "That is probably not your username."} + + validate :ign_is_not_skull, :ign_is_not_mojang, :ign_has_paid, :ign_has_correct_case has_many :blogposts has_many :comments + def is? (user) + self == user + end + + #roles + def disabled? + !!(self.role == :disabled) + end + + def banned? + !!(self.role == :banned) + end + + def unconfirmed? + !!(self.role == :unconfirmed) + end + + def confirmed? + !!(self.role > :unconfirmed) + end + + def default? + !!(self.role >= :default) + end + + def donor? + !!(self.role >= :donor) + end + + def mod? + !!(self.role >= :mod) + end + + def admin? + !!(self.role >= :admin) + end + + def superadmin? + !!(self.role >= :superadmin) + end + + private + + def ign_is_not_skull + errors.add(:ign, "Good one...") if ["MHF_Blaze", "MHF_CaveSpider", "MHF_Chicken", "MHF_Cow", "MHF_Enderman", "MHF_Ghast", "MHF_Golem", "MHF_Herobrine", "MHF_LavaSlime", "MHF_MushroomCow", "MHF_Ocelot", "MHF_Pig", "MHF_PigZombie", "MHF_Sheep", "MHF_Slime", "MHF_Spider", "MHF_Squid", "MHF_Villager", "MHF_Cactus", "MHF_Cake", "MHF_Chest", "MHF_Melon", "MHF_OakLog", "MHF_Pumpkin", "MHF_TNT", "MHF_TNT2", "MHF_ArrowUp", "MHF_ArrowDown", "MHF_ArrowLeft", "MHF_ArrowRight", "MHF_Exclamation", "MHF_Question"].include?(self.ign) + end + + def ign_is_not_mojang + errors.add(:ign, "If that's really you, contact us in-game.") if ["mollstam", "carlmanneh", "MinecraftChick", "Notch", "jeb_", "xlson", "jonkagstrom", "KrisJelbring", "marc", "Marc_IRL", "MidnightEnforcer", "YoloSwag4Lyfe", "EvilSeph", "Grumm", "Dinnerbone", "geuder", "eldrone", "JahKob", "BomBoy", "MansOlson", "pgeuder", "91maan90", "vubui", "PoiPoiChen", "mamirm", "eldrone", "_tomcc"].include?(self.ign) + end + + def ign_has_paid + errors.add(:ign, "'#{self.ign}' is not a valid account!") unless haspaid?(self.ign) + end + + def ign_has_correct_case + errors.add(:ign, "The IGN is case-sensitive. Please correct '#{self.ign}'.") unless correct_case?(self.ign) + end + + def strip_whitespaces + self.name.strip! if self.name + self.ign.strip! if self.ign + self.email.strip! if self.email + self.about.strip! if self.about + self.skype.strip! if self.skype + self.youtube.strip! if self.youtube + self.twitter.strip! if self.twitter + end end \ No newline at end of file diff --git a/app/views/blogposts/edit.html.erb b/app/views/blogposts/edit.html.erb index 94a2fe2..75e1a3e 100644 --- a/app/views/blogposts/edit.html.erb +++ b/app/views/blogposts/edit.html.erb @@ -2,9 +2,9 @@ <%= simple_form_for @post do |f|%> <%= f.input :title, :label => false %> - <%= f.input :text, :label => false %> + <%= f.input :content, :label => false %> <%= f.submit "Update Post", :id => "edit_create_post" %> <% end %>
- <%= button_to "Delete post", @post, :method => "delete", :confirm => "Delete post forever?" %> + <%= button_to "Delete post", @post, :method => "delete", :confirm => "Delete post + comments forever?" %>
diff --git a/app/views/blogposts/index.html.erb b/app/views/blogposts/index.html.erb index 4c78ebf..48c1e4e 100644 --- a/app/views/blogposts/index.html.erb +++ b/app/views/blogposts/index.html.erb @@ -8,12 +8,12 @@
- <%= RbbCode.new.convert(p.text).html_safe %> + <%= GitHub::Markdown.render_gfm(Sanitize.clean(p.content, Sanitize::Config::RESTRICTED)).html_safe %>
<% end %> - <%= link_to 'Make new Post', new_blogpost_path if current_user && current_user.rank >= rank_to_int("mod") %> + <%= link_to 'Make new Post', new_blogpost_path if mod? %> diff --git a/app/views/blogposts/new.html.erb b/app/views/blogposts/new.html.erb index 6408dcb..e599f35 100644 --- a/app/views/blogposts/new.html.erb +++ b/app/views/blogposts/new.html.erb @@ -1,6 +1,6 @@

New Post

<%= simple_form_for @post do |f|%> <%= f.input :title, :label => false %> - <%= f.input :text, :label => false %> + <%= f.input :content, :label => false %> <%= f.submit "Update Post", :id => "edit_create_post" %> <% end %> diff --git a/app/views/blogposts/show.html.erb b/app/views/blogposts/show.html.erb index 934a5fc..6aec547 100644 --- a/app/views/blogposts/show.html.erb +++ b/app/views/blogposts/show.html.erb @@ -3,12 +3,12 @@

<%= @post.title %>

- <%= RbbCode.new.convert(@post.text).html_safe %> + <%= GitHub::Markdown.render_gfm(Sanitize.clean(@post.content, Sanitize::Config::RESTRICTED)).html_safe %>
<% @post.comments.each do |c| %> diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 630846a..222807f 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -1,8 +1,8 @@ -
"> - <%= link_to c.user.name, c.user %> <%= c.created_at.strftime("%e. %b %Y, %H:%m") %> - <% if mod? || current_user == c.user %> +
"> + <%= link_to c.author.name, c.author %> <%= c.created_at.strftime("%e. %b %Y, %H:%m") %> + <% if mod? || c.author.is?(current_user) %> <% end %> -
<%= h(c.text).gsub(/(\w*[\r\n]){3,}/, "\n\n").gsub("\n", "
").html_safe %>
+
<%= h(c.content).gsub(/(\w*[\r\n]){3,}/, "\n\n").gsub("\n", "
").html_safe %>
\ No newline at end of file diff --git a/app/views/comments/_new.html.erb b/app/views/comments/_new.html.erb index d97db77..230d171 100644 --- a/app/views/comments/_new.html.erb +++ b/app/views/comments/_new.html.erb @@ -1,7 +1,7 @@ <% if current_user %>

New comment

<%= simple_form_for [@post, @comment] do |f| %> - <%= f.input :text, :label => false, :as => "text", :placeholder => "Comment" %> + <%= f.input :content, :label => false, :as => "text", :placeholder => "Comment" %> <%= f.submit %> <% end %> <% end %> \ No newline at end of file diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb index 4a91606..2283625 100644 --- a/app/views/comments/edit.html.erb +++ b/app/views/comments/edit.html.erb @@ -1,6 +1,9 @@

Edit comment

<%= simple_form_for [@comment.blogpost, @comment] do |f| %> - <%= f.input :text, :label => false, :as => "text", :placeholder => "Comment" %> - <%= f.submit %> -<% end %> \ No newline at end of file + <%= f.input :content, :label => false, :as => "text", :placeholder => "Comment" %> + <%= f.submit "Update Comment", :id => "edit_create_comment" %> +<% end %> +
+ <%= button_to "Delete comment", [@comment.blogpost, @comment] , :method => "delete", :confirm => "Delete comment forever?" %> +
\ No newline at end of file diff --git a/app/views/forumgroups/index.html.erb b/app/views/forumgroups/index.html.erb index 4eaa21f..4f2b757 100644 --- a/app/views/forumgroups/index.html.erb +++ b/app/views/forumgroups/index.html.erb @@ -1,14 +1,14 @@
- <% @groups.each do |g| %> -
+ <% @groups.each do |group| %> +
- <%= g.name %> + <%= group.name %>
- <% g.forums.sort_by{|s| s[:position]}.each do |f| %> + <% group.forums.sort_by{|s| s[:position]}.each do |f| %>
- <%= f.name %> + <%= link_to f.name, f %>
<% end %>
diff --git a/app/views/forums/show.html.erb b/app/views/forums/show.html.erb new file mode 100644 index 0000000..69d1690 --- /dev/null +++ b/app/views/forums/show.html.erb @@ -0,0 +1,20 @@ +
<%= link_to @forum.group, forumgroup_path(@forum.group) %> → <%= link_to @forum %>
+

<%= @forum.name %>

+
+ <% @threads.each do |thread| %> +
+
+ <%= thread.name %> +
+ +
+ <% thread.forums.sort_by{|s| s[:position]}.each do |f| %> +
+ <%= link_to f.name, f %> +
+ <% end %> +
+ +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index 125a702..596f073 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -1,7 +1,9 @@