mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
Completely refactors Karma (#17447)
* Refactors Karma * I FELL VICTIM TO MY OWN CI * Update code/modules/client/client_procs.dm * Update SQL/updates/31-32.py * Mochi tweaks Co-authored-by: dearmochi <1496804+dearmochi@users.noreply.github.com> Co-authored-by: dearmochi <1496804+dearmochi@users.noreply.github.com>
This commit is contained in:
co-authored by
dearmochi
parent
e19931c643
commit
95ce462b14
@@ -3381,8 +3381,7 @@
|
||||
<li>Total Karma: [C.karmaholder.karma_earned]</li>
|
||||
<li>Spent Karma: [C.karmaholder.karma_spent]</li>
|
||||
<li>Available Karma: [C.karmaholder.karma_earned - C.karmaholder.karma_spent]</li>
|
||||
<li>Unlocked Jobs: [C.karmaholder.unlocked_jobs.Join(", ")]</li>
|
||||
<li>Unlocked Species: [C.karmaholder.unlocked_species.Join(", ")]</li>
|
||||
<li>Unlocked Packages: [C.karmaholder.purchased_packages.Join(", ")]</li>
|
||||
</ul>
|
||||
"}
|
||||
|
||||
|
||||
@@ -397,6 +397,9 @@
|
||||
if(_2fa_alert)
|
||||
to_chat(src,"<span class='boldannounce'><big>You do not have 2FA enabled. Admin verbs will be unavailable until you have enabled 2FA.</big></span>") // Very fucking obvious
|
||||
|
||||
// This happens asyncronously
|
||||
karmaholder.processRefunds(mob)
|
||||
|
||||
|
||||
/client/proc/is_connecting_from_localhost()
|
||||
var/localhost_addresses = list("127.0.0.1", "::1") // Adresses
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
priority = 42
|
||||
|
||||
/datum/client_login_processor/karma_numbers/get_query(client/C)
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karma_totals WHERE byondkey=:ckey", list(
|
||||
"ckey" = C.ckey
|
||||
))
|
||||
return query
|
||||
|
||||
@@ -2,19 +2,11 @@
|
||||
priority = 43
|
||||
|
||||
/datum/client_login_processor/karma_unlocks/get_query(client/C)
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT purchase FROM karma_purchases WHERE ckey=:ckey", list(
|
||||
"ckey" = C.ckey
|
||||
))
|
||||
return query
|
||||
|
||||
/datum/client_login_processor/karma_unlocks/process_result(datum/db_query/Q, client/C)
|
||||
while(Q.NextRow())
|
||||
// Lets split stuff apart
|
||||
C.karmaholder.unlocked_jobs = splittext(Q.item[1], ",")
|
||||
C.karmaholder.unlocked_species = splittext(Q.item[2], ",") // these should really be JSON
|
||||
|
||||
for(var/i in 1 to length(C.karmaholder.unlocked_jobs))
|
||||
C.karmaholder.unlocked_jobs[i] = trim(C.karmaholder.unlocked_jobs[i]) // Trim whitespace
|
||||
|
||||
for(var/i in 1 to length(C.karmaholder.unlocked_species))
|
||||
C.karmaholder.unlocked_species[i] = trim(C.karmaholder.unlocked_species[i]) // Trim whitespace
|
||||
C.karmaholder.addUnlock(Q.item[1])
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
return
|
||||
|
||||
var/datum/db_query/log_query = SSdbcore.NewQuery({"
|
||||
INSERT INTO karma (spendername, spenderkey, receivername, receiverkey, receiverrole, receiverspecial, spenderip, time, server_id)
|
||||
INSERT INTO karma_log (spendername, spenderkey, receivername, receiverkey, receiverrole, receiverspecial, spenderip, time, server_id)
|
||||
VALUES (:sname, :skey, :rname, :rkey, :rrole, :rspecial, :sip, Now(), :server_id)"}, list(
|
||||
"sname" = spender.name,
|
||||
"skey" = spender.ckey,
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
qdel(log_query)
|
||||
|
||||
var/datum/db_query/select_recv = SSdbcore.NewQuery("SELECT id, karma FROM karmatotals WHERE byondkey=:rkey", list(
|
||||
var/datum/db_query/select_recv = SSdbcore.NewQuery("SELECT id, karma FROM karma_totals WHERE byondkey=:rkey", list(
|
||||
"rkey" = receiver.ckey
|
||||
))
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
// They dont exist, lets make them exist
|
||||
if(karma == null)
|
||||
karma = 1
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO karmatotals (byondkey, karma) VALUES (:rkey, :karma)", list(
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO karma_totals (byondkey, karma) VALUES (:rkey, :karma)", list(
|
||||
"rkey" = receiver.ckey,
|
||||
"karma" = karma
|
||||
))
|
||||
@@ -63,7 +63,7 @@
|
||||
// They do exist. Update it.
|
||||
else
|
||||
karma++
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karma=:karma WHERE id=:id", list(
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karma_totals SET karma=:karma WHERE id=:id", list(
|
||||
"karma" = karma,
|
||||
"id" = id
|
||||
))
|
||||
@@ -200,5 +200,5 @@ GLOBAL_LIST_EMPTY(karma_spenders)
|
||||
to_chat(src, "<span class='warning'>Karma is disabled.</span>")
|
||||
return
|
||||
|
||||
karmaholder.open_shop_menu()
|
||||
karmaholder.ui_interact(usr)
|
||||
|
||||
|
||||
+145
-343
@@ -1,17 +1,14 @@
|
||||
// This file contains stuff regarding the karma holder datum
|
||||
// This is attached to a client and holds their info
|
||||
/datum/karma_holder
|
||||
/// List of jobs this person has unlocked
|
||||
var/list/unlocked_jobs = list()
|
||||
/// List of species this person has unlocked
|
||||
var/list/unlocked_species = list()
|
||||
/// List of karma packages this user has purchased
|
||||
var/list/purchased_packages = list()
|
||||
/// List of packages where a refund is due
|
||||
var/list/refundable_packages = list()
|
||||
/// Amount of karma earned total
|
||||
var/karma_earned = 0
|
||||
/// Amount of karma spent total
|
||||
var/karma_spent = 0
|
||||
/// What tab are they on
|
||||
var/karma_tab = 0
|
||||
|
||||
|
||||
// Safety stuff
|
||||
/datum/karma_holder/vv_edit_var(var_name, var_value)
|
||||
@@ -20,123 +17,33 @@
|
||||
/datum/karma_holder/CanProcCall(procname)
|
||||
return FALSE // no
|
||||
|
||||
// Opens the karma shop menu
|
||||
/datum/karma_holder/proc/open_shop_menu()
|
||||
var/dat = "<html><body><center>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=0' [karma_tab == 0 ? "class='linkOn'" : ""]>Job Unlocks</a>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=1' [karma_tab == 1 ? "class='linkOn'" : ""]>Species Unlocks</a>"
|
||||
dat += "<a href='?src=[UID()];karmashop=tab;tab=2' [karma_tab == 2 ? "class='linkOn'" : ""]>Karma Refunds</a>"
|
||||
dat += "</center>"
|
||||
dat += "<HR>"
|
||||
/datum/karma_holder/proc/addUnlock(package)
|
||||
if(!(package in GLOB.karma_packages))
|
||||
stack_trace("Someone removed a karma package [package] from the game entirely. This should never happen. Please beat the person who did this.")
|
||||
return
|
||||
|
||||
var/currentkarma = (karma_earned - karma_spent)
|
||||
dat += "You have <b>[currentkarma]</b> available.<br><HR>"
|
||||
purchased_packages += package
|
||||
var/datum/karma_package/KP = GLOB.karma_packages[package]
|
||||
if(KP.refundable)
|
||||
refundable_packages += package // Put it in the pool of stuff to be refunded
|
||||
|
||||
switch(karma_tab)
|
||||
if(0) // Job Unlocks
|
||||
if(!("Barber" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=1'>Unlock Barber -- 5KP</a><br>"
|
||||
else
|
||||
dat += "Barber - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Nanotrasen Representative" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=3'>Unlock Nanotrasen Representative -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Nanotrasen Representative - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Blueshield" in unlocked_jobs))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=4'>Unlock Blueshield -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Blueshield - <font color='green'>Unlocked</font><br>"
|
||||
/datum/karma_holder/proc/hasPackage(package)
|
||||
return (package in purchased_packages)
|
||||
|
||||
if(1) // Species Unlocks
|
||||
if(!("Machine" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=1'>Unlock Machine People -- 15KP</a><br>"
|
||||
else
|
||||
dat += "Machine People - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Kidan" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=2'>Unlock Kidan -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Kidan - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Grey" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=3'>Unlock Grey -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Grey - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Drask" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=7'>Unlock Drask -- 30KP</a><br>"
|
||||
else
|
||||
dat += "Drask - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Vox" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Vox - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Slime People" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Slime People - <font color='green'>Unlocked</font><br>"
|
||||
if(!("Plasmaman" in unlocked_species))
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 45KP</a><br>"
|
||||
else
|
||||
dat += "Plasmaman - <font color='green'>Unlocked</font><br>"
|
||||
|
||||
if(2) // Karma Refunds
|
||||
var/list/refundable = list()
|
||||
// Get both
|
||||
var/list/purchased = unlocked_jobs + unlocked_species
|
||||
if("Tajaran Ambassador" in purchased)
|
||||
refundable += "Tajaran Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Tajaran Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Tajaran Ambassador -- 30KP</a><br>"
|
||||
if("Unathi Ambassador" in purchased)
|
||||
refundable += "Unathi Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Unathi Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Unathi Ambassador -- 30KP</a><br>"
|
||||
if("Skrell Ambassador" in purchased)
|
||||
refundable += "Skrell Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Skrell Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Skrell Ambassador -- 30KP</a><br>"
|
||||
if("Diona Ambassador" in purchased)
|
||||
refundable += "Diona Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Diona Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Diona Ambassador -- 30KP</a><br>"
|
||||
if("Kidan Ambassador" in purchased)
|
||||
refundable += "Kidan Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Kidan Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Kidan Ambassador -- 30KP</a><br>"
|
||||
if("Slime People Ambassador" in purchased)
|
||||
refundable += "Slime People Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Slime People Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Slime People Ambassador -- 30KP</a><br>"
|
||||
if("Grey Ambassador" in purchased)
|
||||
refundable += "Grey Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Grey Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Grey Ambassador -- 30KP</a><br>"
|
||||
if("Vox Ambassador" in purchased)
|
||||
refundable += "Vox Ambassador"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Vox Ambassador;KarmaRefundType=job;KarmaRefundCost=30'>Refund Vox Ambassador -- 30KP</a><br>"
|
||||
if("Customs Officer" in purchased)
|
||||
refundable += "Customs Officer"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Customs Officer;KarmaRefundType=job;KarmaRefundCost=30'>Refund Customs Officer -- 30KP</a><br>"
|
||||
if("Nanotrasen Recruiter" in purchased)
|
||||
refundable += "Nanotrasen Recruiter"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Nanotrasen Recruiter;KarmaRefundType=job;KarmaRefundCost=10'>Refund Nanotrasen Recruiter -- 10KP</a><br>"
|
||||
if("Mechanic" in purchased)
|
||||
refundable += "Mechanic"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Mechanic;KarmaRefundType=job;KarmaRefundCost=30'>Refund Mechanic -- 30KP</a><br>"
|
||||
if("Security Pod Pilot" in purchased)
|
||||
refundable += "Security Pod Pilot"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Security Pod Pilot;KarmaRefundType=job;KarmaRefundCost=30'>Refund Security Pod Pilot -- 30KP</a><br>"
|
||||
if("Magistrate" in purchased)
|
||||
refundable += "Magistrate"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Magistrate;KarmaRefundType=job;KarmaRefundCost=45'>Refund Magistrate -- 45KP</a><br>"
|
||||
if("Brig Physician" in purchased)
|
||||
refundable += "Brig Physician"
|
||||
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Brig Physician;KarmaRefundType=job;KarmaRefundCost=45'>Refund Brig Physician -- 5KP</a><br>"
|
||||
/datum/karma_holder/proc/processRefunds(mob/user)
|
||||
set waitfor = FALSE
|
||||
if(!length(refundable_packages))
|
||||
return
|
||||
|
||||
if(!length(refundable))
|
||||
dat += "You do not have any refundable karma purchases.<br>"
|
||||
|
||||
dat += "<br><b>Please note that people who attempt to game the karma system will be banned from the system and have all their unlocks revoked. \"Gaming\" the system includes, but is not limited to:<ul><li>- Karma trading</li><li>- OOC Karma begging</li><li>- Code exploits</li></ul></b>"
|
||||
dat += "</center></body></html>"
|
||||
|
||||
var/datum/browser/popup = new(usr, "karmashop", "<div align='center'>Karma Shop</div>", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open(FALSE)
|
||||
for(var/package_id in refundable_packages)
|
||||
var/datum/karma_package/KP = GLOB.karma_packages[package_id]
|
||||
make_refund(KP, user)
|
||||
to_chat(user, "<span class='notice'>You had the Karma package <b>[KP.friendly_name]</b>, which is no longer a store item. You have been automatically refunded <b>[KP.karma_cost]</b> karma.")
|
||||
|
||||
// Reloads the values from the DB to ensure they havnt been gamed
|
||||
/datum/karma_holder/proc/sync_karma(mob/M = usr)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karmatotals WHERE byondkey=:ckey", list(
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT karma, karmaspent FROM karma_totals WHERE byondkey=:ckey", list(
|
||||
"ckey" = M.ckey
|
||||
))
|
||||
|
||||
@@ -150,273 +57,168 @@
|
||||
|
||||
qdel(select_query)
|
||||
|
||||
|
||||
//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm)
|
||||
/datum/karma_holder/proc/karma_purchase(price = 0, category, name, DBname = null)
|
||||
/datum/karma_holder/proc/make_purchase(datum/karma_package/package)
|
||||
sync_karma() // Ensure its up to date
|
||||
|
||||
// INITIAL CHECKS
|
||||
var/karma_available = karma_earned - karma_spent
|
||||
if(karma_available < price)
|
||||
|
||||
if(karma_available < package.karma_cost)
|
||||
to_chat(usr, "You do not have enough karma!")
|
||||
return
|
||||
if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes")
|
||||
|
||||
if(alert("Are you sure you want to unlock [package.friendly_name]?", "Confirmation", "No", "Yes") != "Yes")
|
||||
return
|
||||
if(karma_available < price) // This is repeated for a reason. Someone could queue up 10 windows to buy things.
|
||||
|
||||
if(karma_available < package.karma_cost) // This is repeated for a reason. Someone could queue up 10 windows to buy things.
|
||||
to_chat(usr, "You do not have enough karma!")
|
||||
return
|
||||
if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People)
|
||||
name = DBname
|
||||
switch(category)
|
||||
if("job")
|
||||
DB_job_unlock(name, price)
|
||||
if("species")
|
||||
DB_species_unlock(name, price)
|
||||
else
|
||||
message_admins("Invalid category used in karma shop by [key_name_admin(usr)] | Possible href exploit.")
|
||||
|
||||
open_shop_menu()
|
||||
|
||||
|
||||
/datum/karma_holder/proc/DB_job_unlock(job, cost)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, job FROM whitelist WHERE ckey=:ckey", list(
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey FROM karma_purchases WHERE purchase=:package_id AND ckey=:ckey", list(
|
||||
"package_id" = package.database_id,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
|
||||
if(!select_query.warn_execute())
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbckey
|
||||
while(select_query.NextRow())
|
||||
dbckey = select_query.item[1]
|
||||
dbjob = select_query.item[2]
|
||||
|
||||
qdel(select_query)
|
||||
|
||||
// They exist already
|
||||
if(dbckey)
|
||||
var/list/joblist = splittext(dbjob,",")
|
||||
if(!(job in joblist))
|
||||
joblist += job
|
||||
var/newjoblist = jointext(joblist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET job=:newjoblist WHERE ckey=:ckey", list(
|
||||
"newjoblist" = newjoblist,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [job].")
|
||||
log_karma("[key_name(usr)] has unlocked [job].")
|
||||
qdel(update_query)
|
||||
karmacharge(cost)
|
||||
usr.client.karmaholder.unlocked_jobs += job
|
||||
else
|
||||
to_chat(usr, "You already have this job unlocked!")
|
||||
|
||||
// They dont exist. Insert them
|
||||
else
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, job) VALUES (:ckey, :job)", list(
|
||||
"ckey" = usr.ckey,
|
||||
"job" = job
|
||||
))
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [job].")
|
||||
log_karma("[key_name(usr)] has unlocked [job].")
|
||||
karmacharge(cost)
|
||||
|
||||
qdel(insert_query)
|
||||
|
||||
/datum/karma_holder/proc/DB_species_unlock(species, cost)
|
||||
var/datum/db_query/select_query = SSdbcore.NewQuery("SELECT ckey, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!select_query.warn_execute())
|
||||
if(select_query.NextRow())
|
||||
to_chat(usr, "<span class='notice'>You have already purchased [package.friendly_name]. If you believe this is an error, please contact the server host.</span>")
|
||||
qdel(select_query)
|
||||
return
|
||||
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
|
||||
while(select_query.NextRow())
|
||||
dbckey = select_query.item[1]
|
||||
dbspecies = select_query.item[2]
|
||||
|
||||
qdel(select_query)
|
||||
|
||||
// They exist
|
||||
if(dbckey)
|
||||
var/list/specieslist = splittext(dbspecies,",")
|
||||
if(!(species in specieslist))
|
||||
specieslist += species
|
||||
var/newspecieslist = jointext(specieslist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE whitelist SET species=:newspecieslist WHERE ckey=:ckey", list(
|
||||
"newspecieslist" = newspecieslist,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
|
||||
to_chat(usr, "You have unlocked [species].")
|
||||
log_karma("[key_name(usr)] has unlocked [species].")
|
||||
qdel(update_query)
|
||||
karmacharge(cost)
|
||||
usr.client.karmaholder.unlocked_species += species
|
||||
else
|
||||
to_chat(usr, "You already have this species unlocked!")
|
||||
// Update for this round
|
||||
purchased_packages += package.database_id
|
||||
|
||||
// They dont. New row.
|
||||
else
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO whitelist (ckey, species) VALUES (:ckey, :species)", list(
|
||||
"ckey" = usr.ckey,
|
||||
"species" = species
|
||||
))
|
||||
if(!insert_query.warn_execute())
|
||||
qdel(insert_query)
|
||||
return
|
||||
// Make the insert
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO karma_purchases (ckey, purchase) VALUES (:ckey, :purchase)", list(
|
||||
"ckey" = usr.ckey,
|
||||
"purchase" = package.database_id
|
||||
))
|
||||
|
||||
to_chat(usr, "You have unlocked [species].")
|
||||
log_karma("[key_name(usr)] has unlocked [species].")
|
||||
if(!insert_query.warn_execute())
|
||||
to_chat(usr, "<span class='warning'>Failed to purchase [package.friendly_name]. Please contact the server host.</span>")
|
||||
qdel(insert_query)
|
||||
karmacharge(cost)
|
||||
return
|
||||
|
||||
// Tell them
|
||||
to_chat(usr, "<span class='notice'>You have purchased [package.friendly_name]</span>.")
|
||||
log_karma("[key_name(usr)] has purchased [package.friendly_name].")
|
||||
qdel(insert_query)
|
||||
|
||||
/datum/karma_holder/proc/karmacharge(cost, refund = FALSE)
|
||||
sync_karma() // Ensure its up to date
|
||||
if(refund)
|
||||
karma_spent -= cost
|
||||
else
|
||||
karma_spent += cost
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karmatotals SET karmaspent=:spent WHERE byondkey=:ckey", list(
|
||||
// Charge them
|
||||
karma_spent += package.karma_cost
|
||||
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karma_totals SET karmaspent=:spent WHERE byondkey=:ckey", list(
|
||||
"spent" = karma_spent,
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
message_admins("[key_name_admin(usr)] just bought something with karma but didnt get a balance deduction. Inform the host please.")
|
||||
return
|
||||
|
||||
to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.")
|
||||
log_karma("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.")
|
||||
// Inform them
|
||||
to_chat(usr, "You have been charged [package.karma_cost] karma.")
|
||||
qdel(update_query)
|
||||
|
||||
/datum/karma_holder/proc/karmarefund(type, name, cost)
|
||||
switch(name)
|
||||
if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
|
||||
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer", "Mechanic", "Security Pod Pilot")
|
||||
cost = 30
|
||||
if("Nanotrasen Recruiter")
|
||||
cost = 10
|
||||
if("Magistrate")
|
||||
cost = 45
|
||||
if("Brig Physician")
|
||||
cost = 5
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>That job is not refundable.</span>")
|
||||
return
|
||||
// This is automatically invoked when a user logs in.
|
||||
/datum/karma_holder/proc/make_refund(datum/karma_package/package, mob/user)
|
||||
sync_karma(user) // Ensure its up to date
|
||||
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, job, species FROM whitelist WHERE ckey=:ckey", list(
|
||||
"ckey" = usr.ckey
|
||||
))
|
||||
if(!query.warn_execute())
|
||||
qdel(query)
|
||||
if(!(package.database_id in purchased_packages))
|
||||
to_chat(user, "You do not own [package.friendly_name]!")
|
||||
message_admins("[key_name_admin(user)] attempted to refund a karma package they do not have. Potential href exploit.")
|
||||
return
|
||||
|
||||
var/dbjob
|
||||
var/dbspecies
|
||||
var/dbckey
|
||||
while(query.NextRow())
|
||||
dbckey = query.item[1]
|
||||
dbjob = query.item[2]
|
||||
dbspecies = query.item[3]
|
||||
// Do the delete
|
||||
var/datum/db_query/insert_query = SSdbcore.NewQuery("DELETE FROM karma_purchases WHERE ckey=:ckey AND purchase=:purchase", list(
|
||||
"ckey" = user.ckey,
|
||||
"purchase" = package.database_id
|
||||
))
|
||||
|
||||
qdel(query)
|
||||
if(!insert_query.warn_execute())
|
||||
to_chat(user, "<span class='warning'>Failed to refund [package.friendly_name]. Please contact the server host.</span>")
|
||||
qdel(insert_query)
|
||||
return
|
||||
|
||||
if(dbckey)
|
||||
var/list/typelist = list()
|
||||
var/statement
|
||||
switch(type)
|
||||
if("job")
|
||||
typelist = splittext(dbjob,",")
|
||||
statement = "UPDATE whitelist SET job=:newtypelist WHERE ckey=:ckey"
|
||||
if("species")
|
||||
typelist = splittext(dbspecies,",")
|
||||
statement = "UPDATE whitelist SET species=:newtypelist WHERE ckey=:ckey"
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Type [type] is not a valid column.</span>")
|
||||
// Update for this round
|
||||
purchased_packages -= package.database_id
|
||||
|
||||
if(name in typelist)
|
||||
typelist -= name
|
||||
var/newtypelist = jointext(typelist,",")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery(statement, list(
|
||||
"ckey" = usr.ckey,
|
||||
"newtypelist" = newtypelist
|
||||
))
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
return
|
||||
else
|
||||
to_chat(usr, "You have been refunded [cost] karma for [type] [name].")
|
||||
log_karma("[key_name(usr)] has been refunded [cost] karma for [type] [name].")
|
||||
switch(type)
|
||||
if("job")
|
||||
usr.client.karmaholder.unlocked_jobs -= name
|
||||
if("species")
|
||||
usr.client.karmaholder.unlocked_species -= name
|
||||
qdel(update_query)
|
||||
karmacharge(text2num(cost), TRUE)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You have not bought [name].</span>")
|
||||
// Refund them
|
||||
karma_spent -= package.karma_cost
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Your ckey ([dbckey]) was not found.</span>")
|
||||
var/datum/db_query/update_query = SSdbcore.NewQuery("UPDATE karma_totals SET karmaspent=:spent WHERE byondkey=:ckey", list(
|
||||
"spent" = karma_spent,
|
||||
"ckey" = user.ckey
|
||||
))
|
||||
|
||||
/datum/karma_holder/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["karmashop"])
|
||||
if(!GLOB.configuration.general.enable_karma)
|
||||
to_chat(src, "Karma is disabled on this server.")
|
||||
return
|
||||
if(!update_query.warn_execute())
|
||||
qdel(update_query)
|
||||
message_admins("[key_name_admin(user)] just tried to refund a karma purchase but didnt get a balance deduction. Inform the host please.")
|
||||
return
|
||||
|
||||
switch(href_list["karmashop"])
|
||||
if("tab")
|
||||
karma_tab = text2num(href_list["tab"])
|
||||
open_shop_menu()
|
||||
return
|
||||
if("shop")
|
||||
if(href_list["KarmaBuy"])
|
||||
switch(href_list["KarmaBuy"])
|
||||
if("1")
|
||||
karma_purchase(5, "job", "Barber")
|
||||
if("3")
|
||||
karma_purchase(30, "job", "Nanotrasen Representative")
|
||||
if("4")
|
||||
karma_purchase(30, "job", "Blueshield")
|
||||
return
|
||||
if(href_list["KarmaBuy2"])
|
||||
switch(href_list["KarmaBuy2"])
|
||||
if("1")
|
||||
karma_purchase(15, "species", "Machine People", "Machine")
|
||||
if("2")
|
||||
karma_purchase(30, "species", "Kidan")
|
||||
if("3")
|
||||
karma_purchase(30, "species", "Grey")
|
||||
if("4")
|
||||
karma_purchase(45, "species", "Vox")
|
||||
if("5")
|
||||
karma_purchase(45, "species", "Slime People")
|
||||
if("6")
|
||||
karma_purchase(45, "species", "Plasmaman")
|
||||
if("7")
|
||||
karma_purchase(30, "species", "Drask")
|
||||
return
|
||||
if(href_list["KarmaRefund"])
|
||||
var/type = href_list["KarmaRefundType"]
|
||||
var/job = href_list["KarmaRefund"]
|
||||
var/cost = href_list["KarmaRefundCost"]
|
||||
karmarefund(type, job, cost)
|
||||
open_shop_menu()
|
||||
return
|
||||
qdel(update_query)
|
||||
|
||||
/datum/karma_holder/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "KarmaShop", "Karma Shop", 400, 700, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
// Packages they have + Balance
|
||||
/datum/karma_holder/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["purchased_packages"] = purchased_packages.Copy() // Do I need to copy here? Probably
|
||||
data["karma_balance"] = (karma_earned - karma_spent)
|
||||
|
||||
return data
|
||||
|
||||
// All the packages
|
||||
/datum/karma_holder/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
var/list/packages = list()
|
||||
|
||||
for(var/kp_id in GLOB.karma_packages)
|
||||
var/datum/karma_package/KP = GLOB.karma_packages[kp_id]
|
||||
if(KP.refundable)
|
||||
continue
|
||||
var/list/package_data = list()
|
||||
package_data["id"] = KP.database_id
|
||||
package_data["name"] = KP.friendly_name
|
||||
package_data["cat"] = KP.category
|
||||
package_data["cost"] = KP.karma_cost
|
||||
|
||||
// Remember, TGUI lists need to be 2 layers deep because BYOND JSON memes
|
||||
packages += list(package_data)
|
||||
|
||||
data["all_packages"] = packages
|
||||
|
||||
return data
|
||||
|
||||
// UI callback
|
||||
/datum/karma_holder/ui_act(action, list/params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("makepurchase")
|
||||
var/purchase_id = params["id"]
|
||||
if(!(purchase_id in GLOB.karma_packages))
|
||||
to_chat(usr, "<span class='warning'>That isnt a purchaseable package. What the heck? Please make an issue report.</span>")
|
||||
return FALSE
|
||||
var/datum/karma_package/kp = GLOB.karma_packages[purchase_id]
|
||||
if(kp.refundable)
|
||||
to_chat(usr, "<span class='warning'>That isnt a purchaseable package. What the heck? Please make an issue report.</span>")
|
||||
return FALSE
|
||||
|
||||
make_purchase(kp)
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
// This entire file makes me with DM had enums
|
||||
|
||||
/// Base datum for karma packages
|
||||
/datum/karma_package
|
||||
/// DB ID. MUST BE UNIQUE. It should follow CATEGORY_ProductName casing. Should be a respective define in [code/__DEFINES/karma.dm]
|
||||
var/database_id = "ERROR_Unset"
|
||||
/// Friendly name to show to the user
|
||||
var/friendly_name = "Some coder was lazy"
|
||||
/// Cost of karma
|
||||
var/karma_cost = 0
|
||||
/// Is this package refundable?
|
||||
var/refundable = FALSE
|
||||
/// Category to show in under the karma store
|
||||
var/category = "UNSET"
|
||||
/// List of "Meta" packages that arent entries, just organisers
|
||||
var/list/meta_packages = list(/datum/karma_package/job, /datum/karma_package/species)
|
||||
|
||||
/datum/karma_package/vv_edit_var(var_name, var_value)
|
||||
return FALSE // fuck off
|
||||
|
||||
|
||||
// If you are ever removing something from the karma store, **DO NOT** delete its definition datum.
|
||||
// Just set redunable = TRUE on it so people can get their karma refund
|
||||
|
||||
// Jobs
|
||||
/datum/karma_package/job
|
||||
category = "Karma Jobs"
|
||||
|
||||
/datum/karma_package/job/blueshield
|
||||
database_id = KARMAPACKAGE_JOB_BLUESHIELD
|
||||
friendly_name = "Blueshield"
|
||||
karma_cost = 30
|
||||
|
||||
/datum/karma_package/job/barber
|
||||
database_id = KARMAPACKAGE_JOB_BARBER
|
||||
friendly_name = "Barber"
|
||||
karma_cost = 5
|
||||
|
||||
/datum/karma_package/job/brigphys
|
||||
database_id = KARMAPACKAGE_JOB_BRIGPHYSICIAN
|
||||
friendly_name = "Brig Physician"
|
||||
karma_cost = 5
|
||||
refundable = TRUE
|
||||
|
||||
/datum/karma_package/job/ntrep
|
||||
database_id = KARMAPACKAGE_JOB_NANOTRASENREPRESENTATIVE
|
||||
friendly_name = "Nanotrasen Representative"
|
||||
karma_cost = 30
|
||||
|
||||
/datum/karma_package/job/secpodpilot
|
||||
database_id = KARMAPACKAGE_JOB_SECURITYPODPILOT
|
||||
friendly_name = "Security Pod Pilot"
|
||||
karma_cost = 30
|
||||
refundable = TRUE
|
||||
|
||||
/datum/karma_package/job/mechanic
|
||||
database_id = KARMAPACKAGE_JOB_MECHANIC
|
||||
friendly_name = "Mechanic"
|
||||
karma_cost = 30
|
||||
refundable = TRUE
|
||||
|
||||
/datum/karma_package/job/magistrate
|
||||
database_id = KARMAPACKAGE_JOB_MAGISTRATE
|
||||
friendly_name = "Magistrate"
|
||||
karma_cost = 45
|
||||
refundable = TRUE
|
||||
|
||||
|
||||
// Species
|
||||
/datum/karma_package/species
|
||||
category = "Karma Species"
|
||||
|
||||
/datum/karma_package/species/grey
|
||||
database_id = KARMAPACKAGE_SPECIES_GREY
|
||||
friendly_name = "Grey"
|
||||
karma_cost = 30
|
||||
|
||||
/datum/karma_package/species/kidan
|
||||
database_id = KARMAPACKAGE_SPECIES_KIDAN
|
||||
friendly_name = "Kidan"
|
||||
karma_cost = 30
|
||||
|
||||
/datum/karma_package/species/slimepeople
|
||||
database_id = KARMAPACKAGE_SPECIES_SLIMEPEOPLE
|
||||
friendly_name = "Slime People"
|
||||
karma_cost = 45
|
||||
|
||||
/datum/karma_package/species/vox
|
||||
database_id = KARMAPACKAGE_SPECIES_VOX
|
||||
friendly_name = "Vox" // pox
|
||||
karma_cost = 45
|
||||
|
||||
/datum/karma_package/species/drask
|
||||
database_id = KARMAPACKAGE_SPECIES_DRASK
|
||||
friendly_name = "Drask"
|
||||
karma_cost = 30
|
||||
|
||||
/datum/karma_package/species/machine
|
||||
database_id = KARMAPACKAGE_SPECIES_MACHINE
|
||||
friendly_name = "Machine People (IPC)"
|
||||
karma_cost = 15
|
||||
|
||||
/datum/karma_package/species/plasmaman
|
||||
database_id = KARMAPACKAGE_SPECIES_PLASMAMAN
|
||||
friendly_name = "Plasmaman"
|
||||
karma_cost = 45
|
||||
Reference in New Issue
Block a user