proc/sql_report_karma(var/mob/spender, var/mob/receiver) var/sqlspendername = sanitizeSQL(spender.name) var/sqlspenderkey = spender.key var/sqlreceivername = sanitizeSQL(receiver.name) var/sqlreceiverkey = receiver.key var/sqlreceiverrole = "None" var/sqlreceiverspecial = "None" var/sqlspenderip = spender.client.address if(receiver.mind) if(receiver.mind.special_role) sqlreceiverspecial = sanitizeSQL(receiver.mind.special_role) if(receiver.mind.assigned_role) sqlreceiverrole = sanitizeSQL(receiver.mind.assigned_role) if(!dbcon.IsConnected()) log_game("SQL ERROR during karma logging. Failed to connect.") else var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") var/DBQuery/query = dbcon.NewQuery("INSERT INTO karma (spendername, spenderkey, receivername, receiverkey, receiverrole, receiverspecial, spenderip, time) VALUES ('[sqlspendername]', '[sqlspenderkey]', '[sqlreceivername]', '[sqlreceiverkey]', '[sqlreceiverrole]', '[sqlreceiverspecial]', '[sqlspenderip]', '[sqltime]')") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during karma logging. Error : \[[err]\]\n") query = dbcon.NewQuery("SELECT * FROM karmatotals WHERE byondkey='[receiver.key]'") query.Execute() var/karma var/id while(query.NextRow()) id = query.item[1] karma = text2num(query.item[3]) if(karma == null) karma = 1 query = dbcon.NewQuery("INSERT INTO karmatotals (byondkey, karma) VALUES ('[receiver.key]', [karma])") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n") else karma += 1 query = dbcon.NewQuery("UPDATE karmatotals SET karma=[karma] WHERE id=[id]") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during karmatotal logging (updating existing entry). Error : \[[err]\]\n") var/list/karma_spenders = list() /mob/verb/spend_karma_list() set name = "Award Karma" set desc = "Let the gods know whether someone's been nice. Can only be used once per round." set category = "Special Verbs" if(!ticker || !player_list.len) usr << "\red You can't award karma until the game has started." return if(ticker.current_state == GAME_STATE_PREGAME) usr << "\red You can't award karma until the game has started." return var/list/karma_list = list("Cancel") for(var/mob/M in player_list) if(M.client && M.mind) var/special_role = M.mind.special_role if (special_role == "Wizard" || special_role == "Ninja" || special_role == "Syndicate" || special_role == "Syndicate Commando" || special_role == "Vox Raider" || special_role == "Alien") // Don't include special roles, because players use it to meta continue karma_list += M if(!karma_list.len || karma_list.len == 1) usr << "\red There's no-one to spend your karma on." return var/pickedmob = input("Who would you like to award Karma to?", "Award Karma", "Cancel") as null|mob in karma_list if(isnull(pickedmob)) return if(!istype(pickedmob, /mob)) usr << "\red That's not a mob." return spend_karma(pickedmob) /mob/verb/spend_karma(var/mob/M) set name = "Award Karma to Player" set desc = "Let the gods know whether someone's been nice. Can only be used once per round." set category = "Special Verbs" if(!M) usr << "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing." return if(!istype(M, /mob)) usr << "\red That's not a mob." return if(!M.client) usr << "\red That mob has no client connected at the moment." return if(src.client.karma_spent) usr << "\red You've already spent your karma for the round." return for(var/a in karma_spenders) if(a == src.key) usr << "\red You've already spent your karma for the round." return if(M.key == src.key) usr << "\red You can't spend karma on yourself!" return if(M.client.address == src.client.address) message_admins("\red Illegal karma spending detected from [src.key] to [M.key]. Using the same IP!") log_game("\red Illegal karma spending detected from [src.key] to [M.key]. Using the same IP!") usr << "\red The karma system is not available to multi-accounters." var/choice = input("Give [M.name] good karma?", "Karma") in list("Good", "Cancel") if(!choice || choice == "Cancel") return if(choice == "Good" && !(src.client.karma_spent)) if(src.client.karma_spent) usr << "\red You've already spent your karma for the round." return M.client.karma += 1 usr << "[choice] karma spent on [M.name]." src.client.karma_spent = 1 karma_spenders.Add(src.key) if(M.client.karma <= -2 || M.client.karma >= 2) var/special_role = "None" var/assigned_role = "None" var/karma_diary = file("data/logs/karma_[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log") if(M.mind) if(M.mind.special_role) special_role = M.mind.special_role if(M.mind.assigned_role) assigned_role = M.mind.assigned_role karma_diary << "[M.name] ([M.key]) [assigned_role]/[special_role]: [M.client.karma] - [time2text(world.timeofday, "hh:mm:ss")] given by [src.key]" sql_report_karma(src, M) /client/verb/check_karma() set name = "Check Karma" set category = "Special Verbs" set desc = "Reports how much karma you have accrued." var/currentkarma=verify_karma() usr << {"
You have [currentkarma] available."} return /client/proc/verify_karma() var/currentkarma=0 if(!dbcon.IsConnected()) usr << "\red Unable to connect to karma database. Please try again later.
" return else var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey='[src.key]'") query.Execute() var/totalkarma var/karmaspent while(query.NextRow()) totalkarma = query.item[1] karmaspent = query.item[2] currentkarma = (text2num(totalkarma) - text2num(karmaspent)) /* if(totalkarma) usr << {"
You have [currentkarma] available.
You've gained [totalkarma] total karma in your time here.
"} else usr << "Your total karma is: 0
"*/ return currentkarma /client/verb/karmashop() set name = "karmashop" set desc = "Spend your hard-earned karma here" set hidden = 1 karmashopmenu() return /client/proc/karmashopmenu() var/dat = "
" dat += "Job Unlocks" dat += "Species Unlocks" dat += "Karma Refunds" dat += "
" dat += "
" switch(karma_tab) if (0) // Job Unlocks dat += {" Unlock Barber -- 5KP
Unlock Brig Physician -- 5KP
Unlock Nanotrasen Representative -- 30KP
Unlock Blueshield -- 30KP
Unlock Security Pod Pilot -- 30KP
Unlock Mechanic -- 30KP
Unlock Magistrate -- 45KP
"} if (1) // Species Unlocks dat += {" Unlock Machine People -- 15KP
Unlock Kidan -- 30KP
Unlock Grey -- 30KP
Unlock Vox -- 45KP
Unlock Slime People -- 45KP
Unlock Plasmaman -- 100KP
"} if (2) // Karma Refunds var/list/refundable = list() var/list/purchased = checkpurchased() if("Tajaran Ambassador" in purchased) refundable += "Tajaran Ambassador" dat += "Refund Tajaran Ambassador -- 30KP
" if("Unathi Ambassador" in purchased) refundable += "Unathi Ambassador" dat += "Refund Unathi Ambassador -- 30KP
" if("Skrell Ambassador" in purchased) refundable += "Skrell Ambassador" dat += "Refund Skrell Ambassador -- 30KP
" if("Diona Ambassador" in purchased) refundable += "Diona Ambassador" dat += "Refund Diona Ambassador -- 30KP
" if("Kidan Ambassador" in purchased) refundable += "Kidan Ambassador" dat += "Refund Kidan Ambassador -- 30KP
" if("Slime People Ambassador" in purchased) refundable += "Slime People Ambassador" dat += "Refund Slime People Ambassador -- 30KP
" if("Grey Ambassador" in purchased) refundable += "Grey Ambassador" dat += "Refund Grey Ambassador -- 30KP
" if("Vox Ambassador" in purchased) refundable += "Vox Ambassador" dat += "Refund Vox Ambassador -- 30KP
" if("Customs Officer" in purchased) refundable += "Customs Officer" dat += "Refund Customs Officer -- 30KP
" if("Nanotrasen Recruiter" in purchased) refundable += "Nanotrasen Recruiter" dat += "Refund Nanotrasen Recruiter -- 10KP
" if(!refundable.len) dat += "You do not have any refundable karma purchases.
" dat += "
PLEASE NOTE THAT PEOPLE WHO TRY TO GAME THE KARMA SYSTEM WILL END UP ON THE WALL OF SHAME. THIS INCLUDES BUT IS NOT LIMITED TO TRADES, OOC KARMA BEGGING, CODE EXPLOITS, ETC." dat += "" var/datum/browser/popup = new(usr, "karmashop", "
Karma Shop
", 400, 400) popup.set_content(dat) popup.open(0) return /client/proc/DB_job_unlock(var/job,var/cost) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM whitelist WHERE ckey='[usr.key]'") query.Execute() var/dbjob var/dbckey while(query.NextRow()) dbckey = query.item[2] dbjob = query.item[3] if(!dbckey) query = dbcon.NewQuery("INSERT INTO whitelist (ckey, job) VALUES ('[usr.key]','[job]')") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") message_admins("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") return else usr << "You have unlocked [job]." message_admins("[key_name(usr)] has unlocked [job].") karmacharge(cost) if(dbckey) var/list/joblist = text2list(dbjob,",") if(!(job in joblist)) joblist += job var/newjoblist = list2text(joblist,",") query = dbcon.NewQuery("UPDATE whitelist SET job='[newjoblist]' WHERE ckey='[dbckey]'") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") message_admins("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") return else usr << "You have unlocked [job]." message_admins("[key_name(usr)] has unlocked [job].") karmacharge(cost) else usr << "You already have this job unlocked!" return /client/proc/DB_species_unlock(var/species,var/cost) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM whitelist WHERE ckey='[usr.key]'") query.Execute() var/dbspecies var/dbckey while(query.NextRow()) dbckey = query.item[2] dbspecies = query.item[4] if(!dbckey) query = dbcon.NewQuery("INSERT INTO whitelist (ckey, species) VALUES ('[usr.key]','[species]')") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") message_admins("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") return else usr << "You have unlocked [species]." message_admins("[key_name(usr)] has unlocked [species].") karmacharge(cost) if(dbckey) var/list/specieslist = text2list(dbspecies,",") if(!(species in specieslist)) specieslist += species var/newspecieslist = list2text(specieslist,",") query = dbcon.NewQuery("UPDATE whitelist SET species='[newspecieslist]' WHERE ckey='[dbckey]'") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") return else usr << "You have unlocked [species]." message_admins("[key_name(usr)] has unlocked [species].") karmacharge(cost) else usr << "You already have this species unlocked!" return /client/proc/karmacharge(var/cost,var/refund = 0) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM karmatotals WHERE byondkey='[usr.key]'") query.Execute() while(query.NextRow()) var/spent = text2num(query.item[4]) if(refund) spent -= cost else spent += cost query = dbcon.NewQuery("UPDATE karmatotals SET karmaspent=[spent] WHERE byondkey='[usr.key]'") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") message_admins("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") return else usr << "You have been [refund ? "refunded" : "charged"] [cost] karma." message_admins("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.") return /client/proc/karmarefund(var/type,var/name,var/cost) if(name == "Tajaran Ambassador") cost = 30 else if(name == "Unathi Ambassador") cost = 30 else if(name == "Skrell Ambassador") cost = 30 else if(name == "Diona Ambassador") cost = 30 else if(name == "Kidan Ambassador") cost = 30 else if(name == "Slime People Ambassador") cost = 30 else if(name == "Grey Ambassador") cost = 30 else if(name == "Vox Ambassador") cost = 30 else if(name == "Customs Officer") cost = 30 else if(name == "Nanotrasen Recruiter") cost = 10 else usr << "\red That job is not refundable." return var/DBQuery/query = dbcon.NewQuery("SELECT * FROM whitelist WHERE ckey='[usr.key]'") query.Execute() var/dbjob var/dbspecies var/dbckey while(query.NextRow()) dbckey = query.item[2] dbjob = query.item[3] dbspecies = query.item[4] if(dbckey) var/list/typelist = list() if(type == "job") typelist = text2list(dbjob,",") else if(type == "species") typelist = text2list(dbspecies,",") else usr << "\red Type [type] is not a valid column." if(name in typelist) typelist -= name var/newtypelist = list2text(typelist,",") query = dbcon.NewQuery("UPDATE whitelist SET [type]='[newtypelist]' WHERE ckey='[dbckey]'") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") return else usr << "You have been refunded [cost] karma for [type] [name]." message_admins("[key_name(usr)] has been refunded [cost] karma for [type] [name].") karmacharge(text2num(cost),1) else usr << "\red You have not bought [name]." else usr << "\red Your ckey ([dbckey]) was not found." /client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases var/DBQuery/query = dbcon.NewQuery("SELECT * FROM whitelist WHERE ckey='[usr.key]'") query.Execute() var/dbjob var/dbspecies var/dbckey while(query.NextRow()) dbckey = query.item[2] dbjob = query.item[3] dbspecies = query.item[4] if(dbckey) var/list/joblist = text2list(dbjob,",") var/list/specieslist = text2list(dbspecies,",") var/list/combinedlist = joblist + specieslist if(name) if(name in combinedlist) return 1 else return 0 else return combinedlist else return 0