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:
AffectedArc07
2022-03-08 22:14:05 +01:00
committed by GitHub
co-authored by dearmochi
parent e19931c643
commit 95ce462b14
21 changed files with 545 additions and 368 deletions
+1 -2
View File
@@ -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>
"}
+3
View File
@@ -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])
+5 -5
View File
@@ -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
View File
@@ -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
+106
View File
@@ -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