lightly fucked level scores
This commit is contained in:
parent
45bc61c3cb
commit
d9a73fe813
|
@ -0,0 +1,18 @@
|
||||||
|
-- +migrate up
|
||||||
|
CREATE TABLE level_scores (
|
||||||
|
account_id INTEGER NOT NULL references accounts(id),
|
||||||
|
level_id INTEGER NOT NULL references levels(id),
|
||||||
|
daily_id INTEGER,
|
||||||
|
|
||||||
|
percent INTEGER NOT NULL,
|
||||||
|
attempts INTEGER NOT NULL DEFAULT 0,
|
||||||
|
clicks INTEGER NOT NULL DEFAULT 0,
|
||||||
|
coins INTEGER NOT NULL DEFAULT 0,
|
||||||
|
progress TEXT NOT NULL DEFAULT "",
|
||||||
|
time INTEGER NOT NULL,
|
||||||
|
|
||||||
|
set_at TEXT NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'now'))
|
||||||
|
);
|
||||||
|
|
||||||
|
-- +migrate down
|
||||||
|
DROP TABLE level_scores;
|
|
@ -0,0 +1,103 @@
|
||||||
|
require "uri"
|
||||||
|
|
||||||
|
include CrystalGauntlet
|
||||||
|
|
||||||
|
CrystalGauntlet.endpoints["/getGJLevelScores211.php"] = ->(body : String): String {
|
||||||
|
params = URI::Params.parse(body)
|
||||||
|
puts params.inspect
|
||||||
|
|
||||||
|
account_id = Accounts.get_account_id_from_params(params)
|
||||||
|
if !account_id || !Accounts.verify_gjp(account_id, params["gjp"])
|
||||||
|
return "-1"
|
||||||
|
end
|
||||||
|
|
||||||
|
level_id = params["levelID"].to_i32
|
||||||
|
daily_id = params["s10"].to_i32
|
||||||
|
if daily_id == 0
|
||||||
|
daily_id = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if params["percent"]? && params["percent"]? != "0"
|
||||||
|
# set score
|
||||||
|
|
||||||
|
attempts = params["s1"].to_i - 8354
|
||||||
|
clicks = params["s2"].to_i - 3991
|
||||||
|
time = params["s3"].to_i - 4085
|
||||||
|
# todo: fix
|
||||||
|
# progress = XorCrypt.encrypt_string(GDBase64.decode_string(params["s6"]), "41274")
|
||||||
|
coins = params["s9"].to_i - 5819
|
||||||
|
if coins > 3
|
||||||
|
return "-1"
|
||||||
|
end
|
||||||
|
percent = params["percent"].to_i
|
||||||
|
if percent > 100
|
||||||
|
return "-1"
|
||||||
|
end
|
||||||
|
|
||||||
|
# todo: account for dailies
|
||||||
|
|
||||||
|
if DATABASE.scalar("select count(*) from level_scores where account_id = ? and level_id = ?", account_id, level_id).as(Int64) > 0
|
||||||
|
# check if an update is truly necessary
|
||||||
|
percent_old, coins_old = DATABASE.query_one("select percent, coins from level_scores where account_id = ? and level_id = ?", account_id, level_id, as: {Int32, Int32})
|
||||||
|
|
||||||
|
if percent > percent_old || coins > coins_old
|
||||||
|
DATABASE.exec("update level_scores set account_id=?, level_id=?, daily_id=?, percent=?, attempts=?, clicks=?, coins=?, progress=?, time=?, set_at=? where account_id = ? and level_id = ?", account_id, level_id, daily_id, percent, attempts, clicks, coins, "", time, Time.utc.to_s("%Y-%m-%d %H:%M:%S"), account_id, level_id)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
DATABASE.exec("insert into level_scores (account_id, level_id, daily_id, percent, attempts, clicks, coins, progress, time) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", account_id, level_id, daily_id, percent, attempts, clicks, coins, "", time)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# return set scores
|
||||||
|
|
||||||
|
type = params["type"]? ? params["type"] : "1"
|
||||||
|
|
||||||
|
case type
|
||||||
|
when 0
|
||||||
|
# friends
|
||||||
|
# todo
|
||||||
|
when 1
|
||||||
|
# global
|
||||||
|
# todo
|
||||||
|
when 2
|
||||||
|
# weekly
|
||||||
|
# todo
|
||||||
|
end
|
||||||
|
|
||||||
|
scores = [] of String
|
||||||
|
|
||||||
|
DATABASE.query_each "select percent, level_scores.coins, set_at, users.username, users.id, users.icon_type, users.color1, users.color2, users.cube, users.ship, users.ball, users.ufo, users.wave, users.robot, users.spider, users.special, users.account_id from level_scores join users on level_scores.account_id = users.account_id where level_id = ? order by percent, level_scores.coins desc", level_id do |rs|
|
||||||
|
percent = rs.read(Int32)
|
||||||
|
coins = rs.read(Int32)
|
||||||
|
set_at = rs.read(String)
|
||||||
|
|
||||||
|
username = rs.read(String)
|
||||||
|
user_id = rs.read(Int32)
|
||||||
|
icon_type = rs.read(Int32)
|
||||||
|
color1 = rs.read(Int32)
|
||||||
|
color2 = rs.read(Int32)
|
||||||
|
|
||||||
|
icon_value = [rs.read(Int32), rs.read(Int32), rs.read(Int32), rs.read(Int32), rs.read(Int32), rs.read(Int32), rs.read(Int32)][icon_type]
|
||||||
|
|
||||||
|
special = rs.read(Int32)
|
||||||
|
|
||||||
|
account_id = rs.read(Int32)
|
||||||
|
|
||||||
|
scores << Format.fmt_hash({
|
||||||
|
1 => username,
|
||||||
|
2 => user_id,
|
||||||
|
9 => icon_value,
|
||||||
|
10 => color1,
|
||||||
|
11 => color2,
|
||||||
|
14 => icon_type,
|
||||||
|
15 => special,
|
||||||
|
16 => account_id,
|
||||||
|
3 => percent,
|
||||||
|
6 => percent == 100 ? 1 : (percent > 75 ? 2 : 3), # ???
|
||||||
|
13 => coins,
|
||||||
|
42 => set_at
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
scores.join("|")
|
||||||
|
}
|
|
@ -6,8 +6,9 @@ CrystalGauntlet.endpoints["/uploadGJLevel21.php"] = ->(body : String): String {
|
||||||
params = URI::Params.parse(body)
|
params = URI::Params.parse(body)
|
||||||
puts params.inspect
|
puts params.inspect
|
||||||
|
|
||||||
|
# todo: green user fixes? pretty please?
|
||||||
ext_id = Accounts.get_ext_id_from_params(params)
|
ext_id = Accounts.get_ext_id_from_params(params)
|
||||||
if ext_id == "-1" || !Accounts.verify_gjp(ext_id, params["gjp"])
|
if !ext_id || !Accounts.verify_gjp(ext_id.to_i, params["gjp"])
|
||||||
return "-1"
|
return "-1"
|
||||||
end
|
end
|
||||||
user_id = Accounts.get_user_id(ext_id)
|
user_id = Accounts.get_user_id(ext_id)
|
||||||
|
|
|
@ -8,17 +8,18 @@ CrystalGauntlet.endpoints["/updateGJUserScore22.php"] = ->(body : String): Strin
|
||||||
params = URI::Params.parse(body)
|
params = URI::Params.parse(body)
|
||||||
puts params.inspect
|
puts params.inspect
|
||||||
|
|
||||||
account_id = Accounts.get_ext_id_from_params(params)
|
account_id = Accounts.get_account_id_from_params(params)
|
||||||
if !Accounts.verify_gjp(account_id, params["gjp"])
|
if !account_id || !Accounts.verify_gjp(account_id, params["gjp"])
|
||||||
return "-1"
|
return "-1"
|
||||||
end
|
end
|
||||||
|
|
||||||
user_id = Accounts.get_user_id(account_id)
|
user_id = Accounts.get_user_id(account_id.to_s)
|
||||||
|
|
||||||
# todo: prevent username change unless it's a capitalization change
|
# todo: prevent username change unless it's a capitalization change
|
||||||
# todo: update account username casing w/ user username
|
# todo: update account username casing w/ user username
|
||||||
# todo: keep track of stat changes to look out for leaderboard cheating & whatnot
|
# todo: keep track of stat changes to look out for leaderboard cheating & whatnot
|
||||||
# todo: cap out demon count at the current amount of uploaded demons? same for stars & user coins. could be expensive though
|
# todo: cap out demon count at the current amount of uploaded demons? same for stars & user coins. could be expensive though
|
||||||
|
# todo: cap icon type
|
||||||
|
|
||||||
DATABASE.exec("update users set username=?, stars=?, demons=?, coins=?, user_coins=?, diamonds=?, icon_type=?, color1=?, color2=?, cube=?, ship=?, ball=?, ufo=?, wave=?, robot=?, spider=?, explosion=?, special=?, glow=?, last_played=? where id=?", params["userName"], params["stars"].to_i32, params["demons"].to_i32, params["coins"].to_i32, params["userCoins"].to_i32, params["diamonds"].to_i32, params["iconType"].to_i32, params["color1"].to_i32, params["color2"].to_i32, params["accIcon"].to_i32, params["accShip"].to_i32, params["accBall"].to_i32, params["accBird"].to_i32, params["accDart"].to_i32, params["accRobot"].to_i32, params["accSpider"].to_i32, params["accExplosion"].to_i32, params["special"].to_i32, params["accGlow"].to_i32, Time.utc.to_s("%Y-%m-%d %H:%M:%S"), user_id)
|
DATABASE.exec("update users set username=?, stars=?, demons=?, coins=?, user_coins=?, diamonds=?, icon_type=?, color1=?, color2=?, cube=?, ship=?, ball=?, ufo=?, wave=?, robot=?, spider=?, explosion=?, special=?, glow=?, last_played=? where id=?", params["userName"], params["stars"].to_i32, params["demons"].to_i32, params["coins"].to_i32, params["userCoins"].to_i32, params["diamonds"].to_i32, params["iconType"].to_i32, params["color1"].to_i32, params["color2"].to_i32, params["accIcon"].to_i32, params["accShip"].to_i32, params["accBall"].to_i32, params["accBird"].to_i32, params["accDart"].to_i32, params["accRobot"].to_i32, params["accSpider"].to_i32, params["accExplosion"].to_i32, params["special"].to_i32, params["accGlow"].to_i32, Time.utc.to_s("%Y-%m-%d %H:%M:%S"), user_id)
|
||||||
|
|
||||||
|
|
|
@ -6,16 +6,25 @@ include CrystalGauntlet
|
||||||
module CrystalGauntlet::Accounts
|
module CrystalGauntlet::Accounts
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def get_ext_id_from_params(params : URI::Params) : String
|
def get_account_id_from_params(params : URI::Params) : Int32 | Nil
|
||||||
|
if params["accountID"]? && params["accountID"]? != "0"
|
||||||
|
# todo: validate password
|
||||||
|
params["accountID"].to_i32
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_ext_id_from_params(params : URI::Params) : String | Nil
|
||||||
return "1"
|
return "1"
|
||||||
if params.has_key?("udid") && params["udid"] != ""
|
if params.has_key?("udid") && params["udid"] != ""
|
||||||
# todo: numeric id check
|
# todo: numeric id check
|
||||||
params["udid"]
|
params["udid"]
|
||||||
elsif params.has_key?("account_id") && params["account_id"] != "" && params["account_id"] != "0"
|
elsif params.has_key?("accountID") && params["accountID"] != "" && params["accountID"] != "0"
|
||||||
# todo: validate password
|
# todo: validate password
|
||||||
params["account_id"]
|
params["accountID"]
|
||||||
else
|
else
|
||||||
"-1"
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -29,7 +38,7 @@ module CrystalGauntlet::Accounts
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def verify_gjp(account_id : String, gjp : String) : Bool
|
def verify_gjp(account_id : Int32, gjp : String) : Bool
|
||||||
hash = DATABASE.scalar("select password from accounts where id = ?", account_id).as(String)
|
hash = DATABASE.scalar("select password from accounts where id = ?", account_id).as(String)
|
||||||
bcrypt = Crypto::Bcrypt::Password.new(hash)
|
bcrypt = Crypto::Bcrypt::Password.new(hash)
|
||||||
bcrypt.verify(GJP.decrypt(gjp))
|
bcrypt.verify(GJP.decrypt(gjp))
|
||||||
|
|
Loading…
Reference in New Issue