From a5ef405ad05f6500c26027de07544ae31b9dec04 Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 31 Dec 2014 19:18:06 +0200 Subject: [PATCH 1/6] Ban Transfer Proc Debug proc, saved for posterity's sake. --- code/modules/admin/NewBan.dm | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 3c29c486..767668ab 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -227,3 +227,67 @@ var/savefile/Banlist for (var/A in Banlist.dir) RemoveBan(A) +//////////////////////////// +//TRANSFER TO SQL DATABASE// +//////////////////////////// +//Used to transfer the old .dbd file contents over to the SQL database. Kept on hand just for the sake of being kept on hand, frankly. +/* +/datum/admins/proc/bantosql() + + establish_db_connection() + + if(!dbcon.IsConnected()) + usr << "\red Failed to establish database connection" + return + else + message_admins("Houston, we have a database!") + + + var/count = 0 +// var/dat + + //junk vars to keep track of simple shit, like serverip + var/serverip = "" + var/bantype_str + var/rounds = 0 + var/duration = -1 + var/job = "" + var/banckey = null + + message_admins("Fetching data now.") + + //var/dat = "
Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total
" + Banlist.cd = "/base" + for (var/A in Banlist.dir) + count++ + Banlist.cd = "/base/[A]" + var/ref = "\ref[src]" + var/key = Banlist["key"] + var/id = Banlist["id"] + var/ip = Banlist["ip"] + var/reason = Banlist["reason"] + banckey = Banlist["bannedby"] + var/minutes = Banlist["minutes"] + var/expiry + if(Banlist["temp"]) + bantype_str = "TEMPBAN" + duration = Banlist["minutes"] + expiry = GetExp(Banlist["minutes"]) + if(!expiry) + expiry = "Removal Pending" + else + expiry = "Permaban" + bantype_str = "PERMABAN" + duration = -1 + + message_admins("Query data: [serverip], [bantype_str], [duration], [key], [id], [ip], [reason], [banckey]") + message_admins("Executing query") + + var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `erro_ban` (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', '[minutes]', '[rounds]', Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[key]', '[id]', '[ip]', '[banckey]', '', '', '', '', null, null, null, null, null, null);") + insert_query.Execute() + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Attempted to transfer the ban of [key].');") + log_query.Execute() + + message_admins("Salvo complete, stand by.") + message_admins("Rounds complete, RTB.") +*/ From fe10748d2fc665ddf146027fa7de0de4d0a935ff Mon Sep 17 00:00:00 2001 From: skull132 Date: Wed, 31 Dec 2014 19:24:29 +0200 Subject: [PATCH 2/6] SQL Preset Admin Ranks Adds a set of preset ranks to assign on the permissions panel, with permissions included. --- .../admin/permissionverbs/permissionedit.dm | 28 +++++++++++++++++-- code/modules/admin/topic.dm | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index d6cc0c95..a52e289d 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -76,16 +76,40 @@ var/new_admin = 1 var/admin_id + + var/flags + switch(new_rank) + if("Head Developer") + flags = 32767 + if("Head Admin") + flags = 32767 + if("Primary Admin") + flags = 8191 + if("Secondary Admin") + flags = 7983 + if("Moderator") + flags = 8196 + if("Trial Moderator") + flags = 8192 + if("Event Host - Moderator") + flags = 15885 + if("Event Host") + flags = 5672 + if("Retired Admin") + flags = 8194 + else + flags = 0 + while(select_query.NextRow()) new_admin = 0 admin_id = text2num(select_query.item[1]) if(new_admin) - var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `erro_admin` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, 0)") + var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `erro_admin` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, '[flags]')") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() - usr << "\blue New admin added." + usr << "\blue New admin added. Don't forget to manually reload the admins for the permissions to load!" else if(!isnull(admin_id) && isnum(admin_id)) var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET rank = '[new_rank]' WHERE id = [admin_id]") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 9cbd1985..f0fbde2b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -151,7 +151,7 @@ if(admin_ranks.len) new_rank = input("Please select a rank", "New rank", null, null) as null|anything in (admin_ranks|"*New Rank*") else - new_rank = input("Please select a rank", "New rank", null, null) as null|anything in list("Game Master","Game Admin", "Trial Admin", "Admin Observer","*New Rank*") + new_rank = input("Please select a rank", "New rank", null, null) as null|anything in list("Head Developer","Head Admin", "Primary Admin", "Secondary Admin", "Moderator", "Trial Moderator", "Event Host - Moderator", "Event Host", "Retired Admin", "*New Rank*") var/rights = 0 if(D) From 1066da98ffdf9fe527bdc3458075770b41a3b2d2 Mon Sep 17 00:00:00 2001 From: skull132 Date: Mon, 5 Jan 2015 23:08:13 +0200 Subject: [PATCH 3/6] Empty hands for mechs! So you can't get animals in the contents. --- code/game/mecha/mecha.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1d38590b..0efbf6be 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -982,11 +982,11 @@ usr << "\blue The [src.name] is already occupied!" src.log_append_to_last("Permission denied.") return -/* + if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." + usr << "\blue You need empty hands to enter the mech." return -*/ + var/passed if(src.dna) if(usr.dna.unique_enzymes==src.dna) From 870c8fcbeed74cdcdd063da73b919434b4395579 Mon Sep 17 00:00:00 2001 From: skull132 Date: Mon, 5 Jan 2015 23:08:22 +0200 Subject: [PATCH 4/6] Missing icon round-up. --- icons/mob/eyes.dmi | Bin 7425 -> 7564 bytes icons/obj/clothing/glasses.dmi | Bin 7103 -> 7216 bytes icons/obj/clothing/hats.dmi | Bin 59844 -> 60116 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index cd1c65a53460af32f4e2dea6b66607ff6dd636d7..e3f3a0f57e495f6a040971da791c1d94a5f36503 100644 GIT binary patch literal 7564 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 F{{iMQCyxLC delta 4241 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 AYybcN From bcd628e6729d7fe35a27c1ce07deb463590b2a0f Mon Sep 17 00:00:00 2001 From: skull132 Date: Mon, 5 Jan 2015 23:10:24 +0200 Subject: [PATCH 5/6] Beurocracy Adds the ability to print forms from the request console, and to print them. Lays the groundwork for things to move over into adding more paper shenanigans. --- code/game/machinery/requests_console.dm | 125 +++++++++++++++++++++++- code/modules/paperwork/paperbin.dm | 26 ++--- 2 files changed, 138 insertions(+), 13 deletions(-) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 641a2e77..05e12878 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -40,6 +40,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() // 8 = view messages // 9 = authentication before sending // 10 = send announcement + // 11 = form database var/silent = 0 // set to 1 for it not to beep all the time // var/hackState = 0 // 0 = not hacked @@ -54,6 +55,9 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/message = ""; var/dpt = ""; //the department which will be receiving the message var/priority = -1 ; //Priority of the message being sent + var/SQLquery + var/paperstock = 10 + var/lid = 0 luminosity = 0 /obj/machinery/requests_console/power_change() @@ -187,6 +191,38 @@ var/list/obj/machinery/requests_console/allConsoles = list() dat += text("Announce
"); dat += text("
Back
") + if(11) //form database + dat += text("NanoTrasen Corporate Forms

") + + establish_db_connection() + + if(!dbcon.IsConnected()) + dat += text("ERROR: Unable to contact external database. Please contact your system administrator for assistance.") + else + dat += {"

+ "} + + //For reference: + //Command forms, 01xx series + //Security forms, 02xx series + //Medical forms, 03xx series + //Engineer forms, 04xx series + //Science forms, 05xx series + //Supply forms, 06xx series + //General forms, 10xx series + + var/DBQuery/query = dbcon.NewQuery(SQLquery) + query.Execute() + + while(query.NextRow()) + var/id = query.item[1] + var/name = query.item[2] + var/department = query.item[3] + dat += "" + dat += "
NCF IDForm Name
NCF-[id][name][department]Print
" + dat += text("
Reset Search") + dat += text("
Back
") + else //main menu screen = 0 announceAuth = 0 @@ -198,13 +234,22 @@ var/list/obj/machinery/requests_console/allConsoles = list() dat += text("Request Assistance
") dat += text("Request Supplies
") - dat += text("Relay Anonymous Information

") + dat += text("Relay Anonymous Information
") + dat += text("NanoTrasen Corporate Form Database

") if(announcementConsole) dat += text("Send station-wide announcement

") if (silent) dat += text("Speaker OFF") else dat += text("Speaker ON") + if(paperstock) + dat += text("
[paperstock] papers in stock.") + else + dat += text("
No paper in stock.") + if(lid) + dat += text("
Paper container lid OPEN.") + else + dat += text("
Paper container lid CLOSE.") user << browse("[dat]", "window=request_console") onclose(user, "req_console") @@ -314,6 +359,57 @@ var/list/obj/machinery/requests_console/allConsoles = list() for (var/mob/O in hearers(4, src.loc)) O.show_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'")) + if(href_list["sort"]) + var/sortdep = sanitizeSQL(href_list["sort"]) + SQLquery += " WHERE department LIKE '%[sortdep]%'" + screen = 11 + + if(href_list["print"]) + var/printid = sanitizeSQL(href_list["print"]) + establish_db_connection() + + if(!dbcon.IsConnected()) + alert("Connection to the database lost. Aborting.") + var/DBQuery/query = dbcon.NewQuery("SELECT id, name, data FROM aurora_forms WHERE id=[printid]") + query.Execute() + + while(query.NextRow()) + var/id = query.item[1] + var/name = query.item[2] + var/data = query.item[3] + var/obj/item/weapon/paper/C = new(src.loc) + + //Let's start the BB >> HTML conversion! + + data = html_encode(data) + data = replacetext(data, "\n", "
") + + C.info += data + C.info = C.parsepencode(C.info) + C.updateinfolinks() + C.name = "NFC-[id] - [name]" + +/* WIP, finish in a further update. + + if(href_list["info"]) + var/whatisname = sanitizeSQL(href_list["info"]) + establish_db_connection() + + if(!dbcon.IsConnected()) + alert("Connection to the database lost. Aborting.") + var/DBQuery/query = dbcon.NewQuery("SELECT id, name, department, info FROM aurora_forms WHERE name=[whatisname]") + query.Execute() + + while(query.NextRow()) + var/id = query.item[1] + var/name = query.item[2] + var/department = query.item[3] + var/info = query.item[1] +*/ + switch( href_list["setLid"] ) + if(null) //skip + if("1") lid = 1 + else lid = 0 //Handle screen switching switch(text2num(href_list["setScreen"])) @@ -339,6 +435,9 @@ var/list/obj/machinery/requests_console/allConsoles = list() if(10) //send announcement if(!announcementConsole) return screen = 10 + if(11) //form database + SQLquery = "SELECT id, name, department FROM aurora_forms" + screen = 11 else //main menu dpt = "" msgVerified = "" @@ -398,8 +497,25 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/obj/item/weapon/stamp/T = O msgStamped = text("Stamped with the [T.name]") updateUsrDialog() + if (istype(O, /obj/item/weapon/paper_bundle)) + if(lid) //More of that restocking business + var/obj/item/weapon/paper_bundle/C = O + paperstock += C.amount + user.drop_item(C) + del(C) + for (var/mob/U in hearers(4, src.loc)) + U.show_message(text("\icon[src] *The Requests Console beeps: 'Paper added.'")) + else + user << "\blue I should open the lid to add more paper, or try faxing one paper at a time." if (istype(O, /obj/item/weapon/paper)) - if(screen == 0) + if(lid) //Stocking them papers + var/obj/item/weapon/paper/C = O + user.drop_item(C) + del(C) + paperstock++ + for (var/mob/U in hearers(4, src.loc)) + U.show_message(text("\icon[src] *The Requests Console beeps: 'Paper added.'")) + else if(screen == 0) //Faxing them papers var/pass = 0 var/sendto = input("Select department.", "Send Fax", null, null) in allConsoles @@ -411,6 +527,9 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/sent = 0 for (var/obj/machinery/requests_console/Console in world) if (Console == sendto) + if(Console.paperstock == 0) + alert("Error! Receiving console out of paper! Aborting!") + return if(!sent) sent = 1 @@ -446,10 +565,12 @@ var/list/obj/machinery/requests_console/allConsoles = list() playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) for (var/mob/player in hearers(4, Console.loc)) player.show_message(text("\icon[Console] *The Requests Console beeps: 'Fax received'")) + Console.paperstock-- if(sent == 1) user.show_message(text("\icon[src] *The Requests Console beeps: 'Message Sent.'")) else user.show_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'")) + return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 03c59d4a..d44e288e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -70,17 +70,21 @@ return -/obj/item/weapon/paper_bin/attackby(obj/item/weapon/paper/i as obj, mob/user as mob) - if(!istype(i)) - return - - user.drop_item() - i.loc = src - user << "You put [i] in [src]." - papers.Add(i) - amount++ - - +/obj/item/weapon/paper_bin/attackby(obj/item/weapon/O as obj, mob/user as mob) + if(istype(O, /obj/item/weapon/paper)) + var/obj/item/weapon/paper/i = O + user.drop_item() + i.loc = src + user << "You put [i] in [src]." + papers.Add(i) + amount++ +/* if(istype(O, /obj/item/weapon/paper_pack)) WIP written in. + var/obj/item/weapon/paper_bundle/j = O + user.drop_item() + amount += j.amount + user << "You add paper from [j] into [src]." + del(j) +*/ /obj/item/weapon/paper_bin/examine() set src in oview(1) From c4d103d855f6e483d063d8f3832af22054aaf5b4 Mon Sep 17 00:00:00 2001 From: skull132 Date: Mon, 5 Jan 2015 23:10:36 +0200 Subject: [PATCH 6/6] Simple_animals cannot buckle Read above. --- .../objects/structures/stool_bed_chair_nest/bed.dm | 10 ++++++++++ .../structures/stool_bed_chair_nest/chairs.dm | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 77a6e26b..2236ef4e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -44,6 +44,16 @@ /obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob) if(!istype(M)) return + if(istype(M, /mob/living/simple_animal)) + if (M == user) + M.visible_message(\ + "\blue [M.name] attempts to buckle in, but fails!",\ + "You attempt to buckle yourself to [src], but find yourself unable to.") + else + M.visible_message(\ + "\blue [user.name] tries to buckle [M.name] in to [src], but fails!",\ + "You are buckled in to [src] by [user.name].") + return buckle_mob(M, user) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 03f28188..4f53f880 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -70,6 +70,16 @@ /obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob) if(!istype(M)) return + if(istype(M, /mob/living/simple_animal)) + if (M == user) + M.visible_message(\ + "\blue [M.name] attempts to buckle in, but fails!",\ + "You attempt to buckle yourself to [src], but find yourself unable to.") + else + M.visible_message(\ + "\blue [user.name] tries to buckle [M.name] in to [src], but fails!",\ + "You are buckled in to [src] by [user.name].") + return buckle_mob(M, user) return @@ -153,7 +163,7 @@ if(propelled) var/mob/living/occupant = buckled_mob unbuckle() - + var/def_zone = ran_zone() var/blocked = occupant.run_armor_check(def_zone, "melee") occupant.throw_at(A, 3, propelled)