require "base64" require "json" require "net/http" require "sequel" require "sinatra" require "uri" require "xxhash" require "zlib" ALPHANUM = [*"0".."9", *"A".."Z", *"a".."z", "-", "_"].freeze env_data = File.read(".env") ENV_HASH = {} env_data.each_line do |line| if (match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/)) _, key, val = match ENV_HASH[key] = val end end CODE_ENV = :dev db_file = File.expand_path("infinsweeper.db") DB = Sequel.connect("sqlite:///#{db_file}", single_threaded: false) DB.run("PRAGMA foreign_keys = ON;") $active_users = DB[:SignedInUsers].all.map { |x| [x[:code], x[:player]] }.to_h load "logman.rb" load "mailer.rb" load "players.rb" load "session.rb" set :public_folder, "public" get "/" do session = Sessions.new request, response Logman.log session["message"] send_file "index.html" end get "/debug" do content_type :json (Sessions.new request, response).all.to_json end post "/signup" do session = Sessions.new request, response data = JSON.parse(request.body.read) if data["email"].nil? || data["pass"].nil? || data["username"].nil? status 400 return { "message" => "Bad request made!" }.to_json end signup_status = Players.mk_player(data["username"], data["email"], data["pass"]) if signup_status[0] == 200 login_status = session.login(data["username"], data["pass"]) status login_status[0] return { "message" => login_status[1] }.to_json end status signup_status[0] return { "message" => signup_status[1] }.to_json end get "/verify/:code" do session = Sessions.new request, response session["message"] = Players.verify(params[:code]) ? "Verified successfully!" : "Verification failed!" redirect "/" end post "/login" do data = JSON.parse(request.body.read) session = Sessions.new request, response uid = session["user"] if $active_users[uid] && !session.logout(uid) status 500 return { "message" => "Internal server error when signing the existing session out!" }.to_json end login_status = session.login(data["username"], data["pass"]) status login_status[0] return { "message" => login_status[1] }.to_json end post "/logout" do session = Sessions.new request, response uid = session["user"] if $active_users[uid].nil? status 400 return { "message" => "Not signed in!" }.to_json end unless session.logout(uid) status 500 return { "message" => "Internal server error when signing you out!" }.to_json end status 200 return { "message" => "Signed out successfully!" }.to_json end post "/forgot_password" do data = JSON.parse(request.body.read) if data["email"].nil? status 400 return { "message" => "Bad request made (Email not provided)!" }.to_json end Players.pass_req(data["email"]) status 200 return { "message" => "Email sent successfully!" }.to_json end get "/reset_password/:code" do redirect "/?reset_code=#{params[:code]}" end post "/reset_password/:code" do data = JSON.parse(request.body.read) if data["pass"].nil? || params[:code].nil? status 400 return { "message" => "Bad request made!" }.to_json end if Players.pass_reset(data["pass"], params[:code]) status 200 return { "message" => "Password reset successfully!" }.to_json else status 400 return { "message" => "Couldn't reset password!" }.to_json end end delete "/rm_player" do session = Sessions.new request, response uid = session["user"] if uid.nil? || $active_users[uid].nil? status 400 return { "message" => "Not signed in!" }.to_json end if session.logout(uid) && Players.rm_player($active_users[uid]) status 200 return { "message" => "Sorry to see you go.." }.to_json else status 500 return { "message" => "Couldn't delete!" }.to_json end end