From 8921d108e238b12fab71cb4834a3020f592b75ae Mon Sep 17 00:00:00 2001 From: jomo Date: Fri, 31 May 2013 22:26:22 +0200 Subject: [PATCH] first release --- Gemfile | 15 ++- Gemfile.lock | 23 ++++ app/assets/images/favicon.ico | Bin 0 -> 1394 bytes app/assets/images/logo.png | Bin 0 -> 580 bytes app/assets/images/off.png | Bin 0 -> 8725 bytes app/assets/images/on.png | Bin 0 -> 6575 bytes app/assets/javascripts/application.js | 6 +- app/assets/javascripts/blogposts.js.coffee | 3 + app/assets/javascripts/comments.js.coffee | 3 + app/assets/javascripts/users.js.coffee | 3 + app/assets/stylesheets/application.css | 15 +-- app/assets/stylesheets/blogposts.css.scss | 3 + app/assets/stylesheets/comments.css.scss | 3 + app/assets/stylesheets/mobi.css.scss | 6 + app/assets/stylesheets/scaffolds.css.scss | 69 ++++++++++ app/assets/stylesheets/screen.css.scss | 127 ++++++++++++++++++ app/assets/stylesheets/style.css.scss | 9 ++ app/controllers/application_controller.rb | 7 + app/controllers/blogposts_controller.rb | 58 ++++++++ app/controllers/comments_controller.rb | 83 ++++++++++++ app/controllers/paypal_controller.rb | 35 +++++ app/controllers/serverchecker_controller.rb | 10 ++ app/controllers/sessions_controller.rb | 29 ++++ app/controllers/users_controller.rb | 54 ++++++++ app/helpers/blogposts_helper.rb | 2 + app/helpers/comments_helper.rb | 2 + app/helpers/users_helper.rb | 2 + app/models/blogpost.rb | 6 + app/models/comment.rb | 6 + app/models/user.rb | 8 ++ app/views/blogposts/_form.html.erb | 5 + app/views/blogposts/edit.html.erb | 6 + app/views/blogposts/index.html.erb | 11 ++ app/views/blogposts/new.html.erb | 3 + app/views/blogposts/show.html.erb | 27 ++++ app/views/comments/_form.html.erb | 17 +++ app/views/comments/edit.html.erb | 6 + app/views/comments/index.html.erb | 21 +++ app/views/comments/new.html.erb | 5 + app/views/comments/show.html.erb | 5 + app/views/layouts/_head.html.erb | 13 ++ app/views/layouts/application.html.erb | 14 +- app/views/rails.png | Bin 0 -> 6646 bytes app/views/sessions/new.html.erb | 8 ++ app/views/users/_form.html.erb | 8 ++ app/views/users/edit.html.erb | 6 + app/views/users/index.html.erb | 4 + app/views/users/new.html.erb | 5 + app/views/users/show.html.erb | 10 ++ config/application.rb | 12 ++ config/routes.rb | 66 ++------- db/migrate/20130518221216_create_users.rb | 16 +++ db/migrate/20130526015928_create_blogposts.rb | 11 ++ db/migrate/20130526020734_create_comments.rb | 11 ++ db/schema.rb | 31 ++++- db/seeds.rb | 5 +- lib/Tools.rb | 39 ++++++ public/favicon.ico | Bin 0 -> 1394 bytes test/fixtures/blogposts.yml | 11 ++ test/fixtures/comments.yml | 11 ++ test/fixtures/users.yml | 11 ++ test/functional/blogposts_controller_test.rb | 49 +++++++ test/functional/comments_controller_test.rb | 49 +++++++ test/functional/users_controller_test.rb | 49 +++++++ test/unit/blogpost_test.rb | 7 + test/unit/comment_test.rb | 7 + test/unit/helpers/blogposts_helper_test.rb | 4 + test/unit/helpers/comments_helper_test.rb | 4 + test/unit/helpers/users_helper_test.rb | 4 + test/unit/user_test.rb | 7 + 70 files changed, 1080 insertions(+), 85 deletions(-) create mode 100644 app/assets/images/favicon.ico create mode 100644 app/assets/images/logo.png create mode 100644 app/assets/images/off.png create mode 100644 app/assets/images/on.png create mode 100644 app/assets/javascripts/blogposts.js.coffee create mode 100644 app/assets/javascripts/comments.js.coffee create mode 100644 app/assets/javascripts/users.js.coffee create mode 100644 app/assets/stylesheets/blogposts.css.scss create mode 100644 app/assets/stylesheets/comments.css.scss create mode 100644 app/assets/stylesheets/mobi.css.scss create mode 100644 app/assets/stylesheets/scaffolds.css.scss create mode 100644 app/assets/stylesheets/screen.css.scss create mode 100644 app/assets/stylesheets/style.css.scss create mode 100644 app/controllers/blogposts_controller.rb create mode 100644 app/controllers/comments_controller.rb create mode 100644 app/controllers/paypal_controller.rb create mode 100644 app/controllers/serverchecker_controller.rb create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/controllers/users_controller.rb create mode 100644 app/helpers/blogposts_helper.rb create mode 100644 app/helpers/comments_helper.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/models/blogpost.rb create mode 100644 app/models/comment.rb create mode 100644 app/models/user.rb create mode 100644 app/views/blogposts/_form.html.erb create mode 100644 app/views/blogposts/edit.html.erb create mode 100644 app/views/blogposts/index.html.erb create mode 100644 app/views/blogposts/new.html.erb create mode 100644 app/views/blogposts/show.html.erb create mode 100644 app/views/comments/_form.html.erb create mode 100644 app/views/comments/edit.html.erb create mode 100644 app/views/comments/index.html.erb create mode 100644 app/views/comments/new.html.erb create mode 100644 app/views/comments/show.html.erb create mode 100644 app/views/layouts/_head.html.erb create mode 100644 app/views/rails.png create mode 100644 app/views/sessions/new.html.erb create mode 100644 app/views/users/_form.html.erb create mode 100644 app/views/users/edit.html.erb create mode 100644 app/views/users/index.html.erb create mode 100644 app/views/users/new.html.erb create mode 100644 app/views/users/show.html.erb create mode 100644 db/migrate/20130518221216_create_users.rb create mode 100644 db/migrate/20130526015928_create_blogposts.rb create mode 100644 db/migrate/20130526020734_create_comments.rb create mode 100644 lib/Tools.rb create mode 100644 public/favicon.ico create mode 100644 test/fixtures/blogposts.yml create mode 100644 test/fixtures/comments.yml create mode 100644 test/fixtures/users.yml create mode 100644 test/functional/blogposts_controller_test.rb create mode 100644 test/functional/comments_controller_test.rb create mode 100644 test/functional/users_controller_test.rb create mode 100644 test/unit/blogpost_test.rb create mode 100644 test/unit/comment_test.rb create mode 100644 test/unit/helpers/blogposts_helper_test.rb create mode 100644 test/unit/helpers/comments_helper_test.rb create mode 100644 test/unit/helpers/users_helper_test.rb create mode 100644 test/unit/user_test.rb diff --git a/Gemfile b/Gemfile index e4e9806..18434a7 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,11 @@ gem 'rails', '3.2.12' # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'sqlite3' - +gem 'jquery-rails' +gem 'therubyracer' +gem 'bcrypt-ruby', '~> 3.0.0' # To use ActiveModel has_secure_password +gem 'simple_form' +gem 'rbbcode' # Gems used only for assets and not required # in production environments by default. @@ -20,11 +24,10 @@ group :assets do gem 'uglifier', '>= 1.0.3' end -gem 'jquery-rails' -gem 'therubyracer' - -# To use ActiveModel has_secure_password -# gem 'bcrypt-ruby', '~> 3.0.0' +group :development do + gem 'better_errors' + gem 'binding_of_caller' +end # To use Jbuilder templates for JSON # gem 'jbuilder' diff --git a/Gemfile.lock b/Gemfile.lock index eecfb76..30f44e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,7 +29,14 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) + bcrypt-ruby (3.0.1) + better_errors (0.7.2) + coderay (>= 1.0.0) + erubis (>= 2.6.6) + binding_of_caller (0.7.1) + debug_inspector (>= 0.0.1) builder (3.0.4) + coderay (1.0.9) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) @@ -37,6 +44,7 @@ GEM coffee-script-source execjs coffee-script-source (1.6.2) + debug_inspector (0.0.2) erubis (2.7.0) execjs (1.4.0) multi_json (~> 1.0) @@ -54,6 +62,7 @@ GEM treetop (~> 1.4.8) mime-types (1.23) multi_json (1.7.3) + nokogiri (1.5.9) polyglot (0.3.3) rack (1.4.5) rack-cache (1.2) @@ -78,14 +87,23 @@ GEM rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) rake (10.0.4) + rbbcode (1.0.3) + sanitize + treetop 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) sass (>= 3.1.10) tilt (~> 1.3) + simple_form (2.1.0) + actionpack (~> 3.0) + activemodel (~> 3.0) sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -109,10 +127,15 @@ PLATFORMS ruby DEPENDENCIES + bcrypt-ruby (~> 3.0.0) + better_errors + binding_of_caller coffee-rails (~> 3.2.1) jquery-rails rails (= 3.2.12) + rbbcode sass-rails (~> 3.2.3) + simple_form sqlite3 therubyracer uglifier (>= 1.0.3) diff --git a/app/assets/images/favicon.ico b/app/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..501f61ad795a4c386258e51cb275f069d5393bcc GIT binary patch literal 1394 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 PKvO85u6{1-oD!M<+S%ZU literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 9097d83..a6df101 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,6 +10,6 @@ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD // GO AFTER THE REQUIRES BELOW. // -//= require jquery -//= require jquery_ujs -//= require_tree . +//= #require jquery +//= #require jquery_ujs +//= #require_tree . diff --git a/app/assets/javascripts/blogposts.js.coffee b/app/assets/javascripts/blogposts.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/blogposts.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/comments.js.coffee b/app/assets/javascripts/comments.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/comments.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/users.js.coffee b/app/assets/javascripts/users.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/users.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 3192ec8..e93ffaf 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,13 +1,6 @@ /* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the top of the - * compiled file, but it's generally better to create a new file per style scope. - * *= require_self - *= require_tree . - */ + *= require style.css + *= require screen.css + *= require mobi.css + */ \ No newline at end of file diff --git a/app/assets/stylesheets/blogposts.css.scss b/app/assets/stylesheets/blogposts.css.scss new file mode 100644 index 0000000..916c0b2 --- /dev/null +++ b/app/assets/stylesheets/blogposts.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Blogposts controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/comments.css.scss b/app/assets/stylesheets/comments.css.scss new file mode 100644 index 0000000..e730912 --- /dev/null +++ b/app/assets/stylesheets/comments.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Comments controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/mobi.css.scss b/app/assets/stylesheets/mobi.css.scss new file mode 100644 index 0000000..154a36b --- /dev/null +++ b/app/assets/stylesheets/mobi.css.scss @@ -0,0 +1,6 @@ +/* CSS for Phones only */ +@media only screen +and (max-width: 999px) +{ + +} \ No newline at end of file diff --git a/app/assets/stylesheets/scaffolds.css.scss b/app/assets/stylesheets/scaffolds.css.scss new file mode 100644 index 0000000..6ec6a8f --- /dev/null +++ b/app/assets/stylesheets/scaffolds.css.scss @@ -0,0 +1,69 @@ +body { + background-color: #fff; + color: #333; + font-family: verdana, arial, helvetica, sans-serif; + font-size: 13px; + line-height: 18px; +} + +p, ol, ul, td { + font-family: verdana, arial, helvetica, sans-serif; + font-size: 13px; + line-height: 18px; +} + +pre { + background-color: #eee; + padding: 10px; + font-size: 11px; +} + +a { + color: #000; + &:visited { + color: #666; + } + &:hover { + color: #fff; + background-color: #000; + } +} + +div { + &.field, &.actions { + margin-bottom: 10px; + } +} + +#notice { + color: green; +} + +.field_with_errors { + padding: 2px; + background-color: red; + display: table; +} + +#error_explanation { + width: 450px; + border: 2px solid red; + padding: 7px; + padding-bottom: 0; + margin-bottom: 20px; + background-color: #f0f0f0; + h2 { + text-align: left; + font-weight: bold; + padding: 5px 5px 5px 15px; + font-size: 12px; + margin: -7px; + margin-bottom: 0px; + background-color: #c00; + color: #fff; + } + ul li { + font-size: 12px; + list-style: square; + } +} diff --git a/app/assets/stylesheets/screen.css.scss b/app/assets/stylesheets/screen.css.scss new file mode 100644 index 0000000..18f730f --- /dev/null +++ b/app/assets/stylesheets/screen.css.scss @@ -0,0 +1,127 @@ +/* CSS for PCs only */ +@media only screen +and (min-width: 1000px) +{ + + + + + a { + transition: color 0.25s; + color: #700; + text-decoration: none; + &:hover { + color: #F00; + } + } + #notice { + background: #8e8; + text-align: center; + padding: 10px; + border-bottom: 3px dashed #8d8; + font-weight: bold; + } + #alert { + background: #ebb; + text-align: center; + padding: 10px; + border-bottom: 3px dashed #fdd; + font-weight: bold; + } + #head { + width: 100%; + height: 40px; + background: #ccc; + border-bottom: 2px solid #aaa; + vertical-align: middle; + #logo { + margin: 4px; + margin-left: 20px; + height: 32px; + width: 32px; + float: left; + background: url('/assets/logo.png'); + } + #userinfo { + float: right; + padding: 0 10px; + margin-top: 2px; + img.avatar { + border: 1px solid #000; + border-radius: 16px; + vertical-align: middle; + &:hover { + box-shadow: 0 0 2px; + } + } + } + } + img.user-avatar { + border: 1px solid #000; + border-radius: 4px; + } + span.no-about { + color: #888; + font-style: italic; + } + + #main-content { + width: 650px; + margin: 0 auto; + background: #eee; + padding: 30px; + + h1 { + font-weight: normal; + font-size: 400%; + margin: 0; + color: #888; + text-shadow: 0 1px #999; + } + } + + #posts { + #post { + margin-bottom: 50px; + #post-title { + margin-bottom: 10px; + h2 { + font-weight: normal; + color: #700; + text-transform: uppercase; + display: inline; + font-size: 250%; + } + .comment-counter { + float: right; + } + } + } + } + + .post-info { + border-bottom: 2px dashed #999; + color: #888; + a { + color: #755; + &:hover{ + color: #d55; + } + } + } + + #post-content { + margin-top: 10px; + clear: both; + } + + #comments { + margin: 50px 0 0 40px; + textarea { + width: 480px; + height: 106px; + max-width: 610px; + } + } + +} \ No newline at end of file diff --git a/app/assets/stylesheets/style.css.scss b/app/assets/stylesheets/style.css.scss new file mode 100644 index 0000000..82d020d --- /dev/null +++ b/app/assets/stylesheets/style.css.scss @@ -0,0 +1,9 @@ +/* General CSS for all screens */ +body { + margin: 0; + padding: 0; + font: 14px/1.6 "Open Sans","Lucida Sans","Lucida Grande","Lucida Sans Unicode",Calibri,sans-serif; +} + +// use screen.css +// and mobi.css \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e8065d9..c5928db 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,10 @@ class ApplicationController < ActionController::Base protect_from_forgery + force_ssl + require "Tools" + private + def current_user + @current_user ||= User.find(session[:user_id]) if session[:user_id] + end + helper_method :current_user end diff --git a/app/controllers/blogposts_controller.rb b/app/controllers/blogposts_controller.rb new file mode 100644 index 0000000..9df5451 --- /dev/null +++ b/app/controllers/blogposts_controller.rb @@ -0,0 +1,58 @@ +class BlogpostsController < ApplicationController + # GET /blogposts + # GET /blogposts.json + def index + @posts = Blogpost.all.reverse + end + + # GET /blogposts/1 + # GET /blogposts/1.json + def show + @post = Blogpost.find(params[:id]) + @comment = Comment.new(:blogpost_id => @post.id) + end + + # GET /blogposts/new + # GET /blogposts/new.json + def new + @post = Blogpost.new + end + + # GET /blogposts/1/edit + def edit + @post = Blogpost.find(params[:id]) + end + + # POST /blogposts + # POST /blogposts.json + def create + @post = Blogpost.new(params[:blogpost]) + @post.user_id = current_user.id unless current_user.nil? + if @post.save + redirect_to @post, notice: 'Post has been created.' + else + render action: "new" + end + end + + # PUT /blogposts/1 + # PUT /blogposts/1.json + def update + @post = Blogpost.find(params[:id]) + + if @post.update_attributes(params[:blogpost]) + redirect_to @post, notice: 'Post has been updated.' + else + render action: "edit" + end + end + + # DELETE /blogposts/1 + # DELETE /blogposts/1.json + def destroy + @post = Blogpost.find(params[:id]) + @post.destroy + + redirect_to blogposts_url + end +end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 0000000..0d9e5b7 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,83 @@ +class CommentsController < ApplicationController + # GET /comments + # GET /comments.json + def index + @comments = Comment.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @comments } + end + end + + # GET /comments/1 + # GET /comments/1.json + def show + @comment = Comment.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @comment } + end + end + + # GET /comments/new + # GET /comments/new.json + def new + @comment = Comment.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @comment } + end + end + + # GET /comments/1/edit + def edit + @comment = Comment.find(params[:id]) + end + + # POST /comments + # POST /comments.json + def create + @comment = Comment.new(params[:comment]) + @comment.user_id = current_user.id + respond_to do |format| + if @comment.save + format.html { redirect_to @comment, notice: 'Comment was successfully created.' } + format.json { render json: @comment, status: :created, location: @comment } + else + format.html { render action: "new" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + # PUT /comments/1 + # PUT /comments/1.json + def update + @comment = Comment.find(params[:id]) + + respond_to do |format| + if @comment.update_attributes(params[:comment]) + format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /comments/1 + # DELETE /comments/1.json + def destroy + @comment = Comment.find(params[:id]) + @comment.destroy + + respond_to do |format| + format.html { redirect_to comments_url } + format.json { head :no_content } + end + end +end diff --git a/app/controllers/paypal_controller.rb b/app/controllers/paypal_controller.rb new file mode 100644 index 0000000..6fc50f9 --- /dev/null +++ b/app/controllers/paypal_controller.rb @@ -0,0 +1,35 @@ +class PaypalController < ApplicationController + protect_from_forgery :except => [:create] #Otherwise the request from PayPal wouldn't make it to the controller + def create + puts request.raw_post + response = validate_IPN_notification(request.raw_post) + case response + when "VERIFIED" + # check that paymentStatus=Completed + # check that txnId has not been previously processed + # check that receiverEmail is your Primary PayPal email + # check that paymentAmount/paymentCurrency are correct + # process payment + when "INVALID" + # log for investigation + else + # error + end + render :nothing => true + end + + + 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) + http.open_timeout = 60 + http.read_timeout = 60 + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + http.use_ssl = true + response = http.post(uri.request_uri, raw, + 'Content-Length' => "#{raw.size}", + 'User-Agent' => "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 new file mode 100644 index 0000000..c87a4bf --- /dev/null +++ b/app/controllers/serverchecker_controller.rb @@ -0,0 +1,10 @@ +class ServercheckerController < ApplicationController + def show + require "Tools" + if Tools.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 new file mode 100644 index 0000000..62af4b3 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,29 @@ +class SessionsController < ApplicationController + + def new + + end + + def create + user = User.find_by_email(params[:email]) + if user && user.authenticate(params[:password]) + user.last_ip = request.remote_ip + user.save + if user.banned + flash[:alert] = "You are banned!" + redirect_to login_path + else + session[:user_id] = user.id + redirect_to root_path, :notice => "Logged in!" + end + else + flash[:alert] = "You're doing it wrong!" + redirect_to login_path + end + end + + def destroy + session[:user_id] = nil + redirect_to root_path, :notice => "Logged out!" + end +end \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000..eb194da --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,54 @@ +class UsersController < ApplicationController + # GET /users + # GET /users.json + def index + @users = User.all + end + + # GET /users/1 + # GET /users/1.json + def show + @user = User.find(params[:id]) + end + + # GET /users/new + # GET /users/new.json + def new + @user = User.new + end + + # GET /users/1/edit + def edit + @user = User.find(params[:id]) + end + + # POST /users + # POST /users.json + def create + @user = User.new(params[:user]) + if @user.save + redirect_to @user, notice: 'User was successfully created.' + else + render action: "new" + end + end + + # PUT /users/1 + # PUT /users/1.json + def update + @user = User.find(params[:id]) + if @user.update_attributes(params[:user]) + redirect_to @user, notice: 'User was successfully updated.' + else + render action: "edit" + end + end + + # DELETE /users/1 + # DELETE /users/1.json + def destroy + @user = User.find(params[:id]) + @user.destroy + redirect_to users_url + end +end diff --git a/app/helpers/blogposts_helper.rb b/app/helpers/blogposts_helper.rb new file mode 100644 index 0000000..48e43d1 --- /dev/null +++ b/app/helpers/blogposts_helper.rb @@ -0,0 +1,2 @@ +module BlogpostsHelper +end diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb new file mode 100644 index 0000000..0ec9ca5 --- /dev/null +++ b/app/helpers/comments_helper.rb @@ -0,0 +1,2 @@ +module CommentsHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000..2310a24 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/blogpost.rb b/app/models/blogpost.rb new file mode 100644 index 0000000..4663d50 --- /dev/null +++ b/app/models/blogpost.rb @@ -0,0 +1,6 @@ +class Blogpost < ActiveRecord::Base + attr_accessible :title, :text + validates_presence_of :title, :text, :user + belongs_to :user + has_many :comments +end diff --git a/app/models/comment.rb b/app/models/comment.rb new file mode 100644 index 0000000..bc2e39e --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,6 @@ +class Comment < ActiveRecord::Base + attr_accessible :text, :user_id, :blogpost_id + validates_presence_of :text, :user_id, :blogpost_id + belongs_to :blogpost + belongs_to :user +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..9347249 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,8 @@ +class User < ActiveRecord::Base + attr_accessible :name, :ign, :email, :about, :password, :password_confirmation + has_secure_password + validates_presence_of :password, :on => :create + + has_many :blogposts + has_many :comments +end \ No newline at end of file diff --git a/app/views/blogposts/_form.html.erb b/app/views/blogposts/_form.html.erb new file mode 100644 index 0000000..a61fb20 --- /dev/null +++ b/app/views/blogposts/_form.html.erb @@ -0,0 +1,5 @@ +<%= simple_form_for @post do |f|%> + <%= f.input :title %> + <%= f.input :text %> + <%= f.submit %> +<% end %> \ No newline at end of file diff --git a/app/views/blogposts/edit.html.erb b/app/views/blogposts/edit.html.erb new file mode 100644 index 0000000..b120662 --- /dev/null +++ b/app/views/blogposts/edit.html.erb @@ -0,0 +1,6 @@ +

Editing blogpost

+ +<%= render 'form' %> + +<%= link_to 'Show', @blogpost %> | +<%= link_to 'Back', blogposts_path %> diff --git a/app/views/blogposts/index.html.erb b/app/views/blogposts/index.html.erb new file mode 100644 index 0000000..c680062 --- /dev/null +++ b/app/views/blogposts/index.html.erb @@ -0,0 +1,11 @@ +

Blog

+
+ <% @posts.each do |p| %> +
+

<%= link_to p.title, p %>

<%= link_to pluralize(p.comments.count, "Comment"), p %>
+ +
<%= RbbCode.new.convert(p.text).html_safe %>
+
+ <% end %> + <%= link_to 'New Blogpost', new_blogpost_path if current_user && current_user.rank >= Tools.rank_to_int(:mod) %> +
diff --git a/app/views/blogposts/new.html.erb b/app/views/blogposts/new.html.erb new file mode 100644 index 0000000..e2478c9 --- /dev/null +++ b/app/views/blogposts/new.html.erb @@ -0,0 +1,3 @@ +

New Blogpost

+ +<%= render 'form' %> diff --git a/app/views/blogposts/show.html.erb b/app/views/blogposts/show.html.erb new file mode 100644 index 0000000..a555a20 --- /dev/null +++ b/app/views/blogposts/show.html.erb @@ -0,0 +1,27 @@ +

<%= @post.title %>

+ +
+ <%= RbbCode.new.convert(@post.text).html_safe %> +
+
+ <% @post.comments.each do |c| %> +
+ <%= link_to c.user.name, c.user %> on <%= c.created_at.strftime("%e. %b %Y") %> + <% if current_user.rank >= Tools.rank_to_int(:mod) %> + - <%= link_to "edit", edit_blogpost_comment_path(c.id) %> + <% end %> + +
<%= c.text %>
+
+ <% end %> + <% if current_user && current_user.rank >= Tools.rank_to_int(:visitor) %> +

New comment

+ <%= simple_form_for [@post, @comment] do |f| %> + <%= f.input :text, :label => false, :as => "text", :placeholder => "Comment" %><%= f.submit %> + <% end %> + <% end %> +
\ No newline at end of file diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb new file mode 100644 index 0000000..a568b0b --- /dev/null +++ b/app/views/comments/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_for(@comment) do |f| %> + <% if @comment.errors.any? %> +
+

<%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:

+ +
    + <% @comment.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb new file mode 100644 index 0000000..12ea7f9 --- /dev/null +++ b/app/views/comments/edit.html.erb @@ -0,0 +1,6 @@ +

Editing comment

+ +<%= render 'form' %> + +<%= link_to 'Show', @comment %> | +<%= link_to 'Back', comments_path %> diff --git a/app/views/comments/index.html.erb b/app/views/comments/index.html.erb new file mode 100644 index 0000000..bfa38fe --- /dev/null +++ b/app/views/comments/index.html.erb @@ -0,0 +1,21 @@ +

Listing comments

+ + + + + + + + +<% @comments.each do |comment| %> + + + + + +<% end %> +
<%= link_to 'Show', comment %><%= link_to 'Edit', edit_comment_path(comment) %><%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Comment', new_comment_path %> diff --git a/app/views/comments/new.html.erb b/app/views/comments/new.html.erb new file mode 100644 index 0000000..07a754a --- /dev/null +++ b/app/views/comments/new.html.erb @@ -0,0 +1,5 @@ +

New comment

+ +<%= render 'form' %> + +<%= link_to 'Back', comments_path %> diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb new file mode 100644 index 0000000..d5e89c7 --- /dev/null +++ b/app/views/comments/show.html.erb @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_comment_path(@comment) %> | +<%= link_to 'Back', comments_path %> diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb new file mode 100644 index 0000000..29e70f3 --- /dev/null +++ b/app/views/layouts/_head.html.erb @@ -0,0 +1,13 @@ + diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7387252..7a5326c 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,14 +1,18 @@ - Site - <%= stylesheet_link_tag "application", :media => "all" %> - <%= javascript_include_tag "application" %> + Redstoner + <%= stylesheet_link_tag "application", :media => "all" %> <%= csrf_meta_tags %> + <%= favicon_link_tag "favicon.ico" %> - +<%= render "/layouts/head" %> +<%= "
#{alert}
".html_safe if alert %> +<%= "
#{notice}
".html_safe if notice %> +
<%= yield %> +
- + \ No newline at end of file diff --git a/app/views/rails.png b/app/views/rails.png new file mode 100644 index 0000000000000000000000000000000000000000..d5edc04e65f555e3ba4dcdaad39dc352e75b575e GIT binary patch literal 6646 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 literal 0 HcmV?d00001 diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb new file mode 100644 index 0000000..7840f59 --- /dev/null +++ b/app/views/sessions/new.html.erb @@ -0,0 +1,8 @@ +

Log in

+<%= form_tag login_path do |f| %> + <%= label_tag :email %>
+ <%= text_field_tag :email %>
+ <%= label_tag :password %>
+ <%= password_field_tag :password %>
+ <%= submit_tag %> +<% end %> \ No newline at end of file diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb new file mode 100644 index 0000000..1ccf767 --- /dev/null +++ b/app/views/users/_form.html.erb @@ -0,0 +1,8 @@ +<%= simple_form_for @user do |f| %> + <%= f.input :name %> + <%= f.input :ign %> + <%= f.input :email %> + <%= f.input :password %> + <%= f.input :password_confirmation %> + <%= f.submit %> +<% end %> diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb new file mode 100644 index 0000000..99bd4cc --- /dev/null +++ b/app/views/users/edit.html.erb @@ -0,0 +1,6 @@ +

Editing user

+ +<%= render 'form' %> + +<%= link_to 'Show', @user %> | +<%= link_to 'Back', users_path %> diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb new file mode 100644 index 0000000..48a5818 --- /dev/null +++ b/app/views/users/index.html.erb @@ -0,0 +1,4 @@ +

Listing users

+<% @users.each do |u| %> + <%= link_to u.name, u %> (<%= u.ign %>) +<% end %> \ No newline at end of file diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb new file mode 100644 index 0000000..85f8414 --- /dev/null +++ b/app/views/users/new.html.erb @@ -0,0 +1,5 @@ +

New user

+ +<%= render 'form' %> + +<%= link_to 'Back', users_path %> \ No newline at end of file diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb new file mode 100644 index 0000000..1cfab4e --- /dev/null +++ b/app/views/users/show.html.erb @@ -0,0 +1,10 @@ +
+<%= image_tag Tools.avatar_url(@user.id, 128), :class => "user-avatar", :alt => "avatar" %>
+<% if @user.banned %> + This user is banned! +<% end %> +IGN: <%= @user.ign %>
+Rank: <%= Tools.int_to_rank(@user.rank) %>
+Joined: <%= @user.created_at.strftime("%e. %b %Y") %>
+Last IP: <%= @user.last_ip %>
+About: <%= @user.about.blank? ? "nothing".html_safe : @user.about %> \ No newline at end of file diff --git a/config/application.rb b/config/application.rb index 042009b..91338ab 100644 --- a/config/application.rb +++ b/config/application.rb @@ -22,6 +22,18 @@ module Site # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + + + + # ****************************************************** + # + # config.force_ssl = true + # + # ****************************************************** + + + # Activate observers that should always be running. # config.active_record.observers = :cacher, :garbage_collector, :forum_observer diff --git a/config/routes.rb b/config/routes.rb index 0d76e85..ec390cb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,58 +1,14 @@ Site::Application.routes.draw do - # The priority is based upon order of creation: - # first created -> highest priority. - # Sample of regular route: - # match 'products/:id' => 'catalog#view' - # Keep in mind you can assign values other than :controller and :action + resources :blogposts do + resources :comments + end + resources :users - # Sample of named route: - # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase - # This route can be invoked with purchase_url(:id => product.id) - - # Sample resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Sample resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Sample resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Sample resource route with more complex sub-resources - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', :on => :collection - # end - # end - - # Sample resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end - - # You can have the root of your site routed with "root" - # just remember to delete public/index.html. - # root :to => 'welcome#index' - - # See how all your routes lay out with "rake routes" - - # This is a legacy wild controller route that's not recommended for RESTful applications. - # Note: This route will make all actions in every controller accessible via GET requests. - # match ':controller(/:action(/:id))(.:format)' -end + match '/serverstatus.png' => 'serverchecker#show' + get "logout" => 'sessions#destroy' + get 'login' => 'sessions#new' + post 'login' => 'sessions#create' + post 'paypal' => 'paypal#create' + root :to => 'blogposts#index' +end \ No newline at end of file diff --git a/db/migrate/20130518221216_create_users.rb b/db/migrate/20130518221216_create_users.rb new file mode 100644 index 0000000..f2f0461 --- /dev/null +++ b/db/migrate/20130518221216_create_users.rb @@ -0,0 +1,16 @@ +class CreateUsers < ActiveRecord::Migration + def change + create_table :users do |t| + t.string :name, :unique => true, :null => false + t.string :ign, :unique => true, :null => false + t.integer :rank, :default => 10, :null => false + t.boolean :banned, :default => false + t.string :email, :unique => true, :null => false + t.text :about + t.string :password_digest, :null => false + t.string :last_ip + + t.timestamps + end + end +end diff --git a/db/migrate/20130526015928_create_blogposts.rb b/db/migrate/20130526015928_create_blogposts.rb new file mode 100644 index 0000000..3b477f7 --- /dev/null +++ b/db/migrate/20130526015928_create_blogposts.rb @@ -0,0 +1,11 @@ +class CreateBlogposts < ActiveRecord::Migration + def change + create_table :blogposts do |t| + t.string :title + t.text :text + t.integer :user_id + + t.timestamps + end + end +end diff --git a/db/migrate/20130526020734_create_comments.rb b/db/migrate/20130526020734_create_comments.rb new file mode 100644 index 0000000..7e3f744 --- /dev/null +++ b/db/migrate/20130526020734_create_comments.rb @@ -0,0 +1,11 @@ +class CreateComments < ActiveRecord::Migration + def change + create_table :comments do |t| + t.text :text + t.integer :user_id + t.integer :blogpost_id + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index b5e6a79..ed8dc4f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,6 +11,35 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 0) do +ActiveRecord::Schema.define(:version => 20130526020734) do + + create_table "blogposts", :force => true do |t| + t.string "title" + t.text "text" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "comments", :force => true do |t| + t.text "text" + t.integer "user_id" + t.integer "blogpost_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "users", :force => true do |t| + t.string "name", :null => false + t.string "ign", :null => false + t.integer "rank", :default => 10, :null => false + t.boolean "banned", :default => false + t.string "email", :null => false + t.text "about" + t.string "password_digest", :null => false + t.string "last_ip" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end end diff --git a/db/seeds.rb b/db/seeds.rb index 4edb1e8..83e9fa7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,4 @@ # This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). # -# Examples: -# -# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) -# Mayor.create(name: 'Emanuel', city: cities.first) +User.create(name: "Redstone Sheep", ign: "noobkackboon", email: "theredstonesheep@gmail.com", about: "Hi, I am the admin :)", password: "123", password_confirmation: "123") diff --git a/lib/Tools.rb b/lib/Tools.rb new file mode 100644 index 0000000..6271f11 --- /dev/null +++ b/lib/Tools.rb @@ -0,0 +1,39 @@ +module Tools + def Tools.avatar_url(user_id, size) + u = User.find_by_id(user_id) + u.nil? ? ign = :char : ign = u.ign + return "https://minotar.net/avatar/#{ign}/#{size}" + end + + def Tools.mc_running? + host = "play.redstoner.com" + port = 25565 + wait = 300/1000.0 #milliseconds, the .0 is required!! + require 'timeout' + require 'socket' + r = false + begin + Timeout::timeout(wait) { + TCPSocket.new host, port + r = true + } + rescue Exception + # could not connect to the server + end + return r + end + + def Tools.rank_to_int(rank) + r = Tools.ranks[rank] + end + + def Tools.int_to_rank(int) + r = Tools.ranks.rassoc(int) + r.nil? ? "unknown" : r[0].to_s + end + + def Tools.ranks + # Lower case !!! + {:visitor => 10, :member => 20, "member+" => 25, :builder => 30, :donor => 40, "donor+" => 45, :mod => 100, :admin => 200, :superadmin => 500} + end +end \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..501f61ad795a4c386258e51cb275f069d5393bcc GIT binary patch literal 1394 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}k|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+n3Xa^B1$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*eWSOjjhNnfE$}v3=O8_{9OHt!~%UoJp+)JAb!m)@b$&7G&dKny0|1L z72#g21{a4^7NqJ2r55Lx7A2*lEl2^R8JRMrHb4Fz0AxMD@#LTGbdLQV+&&oCqqM5 zBS%9sXD166M>jJkM^j@bLzrHd{N&Qy)Vvay-V}sh6P$WMNdXibRxYVUnPsUdZbkXI z3Sci=W#V>=Ax`t4dQ)(_#R#WfeLDpkeNedF86kDYt zC40L+wZCUFFfcyzba4!+xbfwuqiTth-k1kHu|?^W{fAKR=hEPuS)UEi*G zUM!Gn%O}$($h%J5hbGP%=8GAh* z+*u^1I4L*Q;_mLyg!jB2)rJw_wb#rUt8eaq$9SPaS^V;s-2#u81EhZcWtf+L$NA5r zua!&OSJWNcAtf|vXP2AY|`;IzLaTC%Yv-p7*55qS$ML>to{4gjX}eXL2xch*2zrm zhY6)Ya~O>5ADZ0alVYhc_YC*~&IiuA?*AMy zE9v`UvtGt6>ytPZw3~DU9-Wu!{7B-+2B)T`%YDZ@+%x`7{BrB>^B=Y+4Lcrw6)V_n zq{daUIc<7v2;;gNGgQ)|*lh>+_VNmqt6XzF+x&^v_Pd-_O*a@qT6TTVm!4$L zabQkSYRSXEw)bTQdz6dVFHH!Wr~6;n@Pp#ZPkR!6oQ!z7xpMdAX_bxTQG32$lKrB4 ZfZ;`c@pYqbyH