#define LIBRARY_BOOKS_PER_PAGE 25 var/global/datum/library_catalog/library_catalog = new() var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion") /hook/startup/proc/load_manuals() library_catalog.initialize() return 1 /* * Borrowbook datum */ /datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long. var/bookname var/mobname var/getdate var/duedate /* * Cachedbook datum */ /datum/cachedbook // Datum used to cache the SQL DB books locally in order to achieve a performance gain. var/id var/title var/author var/ckey // ADDED 24/2/2015 - N3X var/category var/content var/programmatic=0 // Is the book programmatically added to the catalog? var/forbidden=0 var/path = /obj/item/weapon/book // Type path of the book to generate var/flagged = 0 /datum/cachedbook/proc/LoadFromRow(var/list/row) id = row["id"] author = row["author"] title = row["title"] category = row["category"] ckey = row["ckey"] flagged = row["flagged"] if("content" in row) content = row["content"] programmatic=0 // Builds a SQL statement /datum/library_query var/author var/category var/title /datum/library_query/proc/toSQL() var/list/where = list() if(author || title || category) if(author) where.Add("author LIKE '%[sanitizeSQL(author)]%'") if(category) where.Add("category = '[sanitizeSQL(category)]'") if(title) where.Add("title LIKE '%[sanitizeSQL(title)]%'") return " WHERE " + jointext(where, " AND ") return "" // So we can have catalogs of books that are programmatic, and ones that aren't. /datum/library_catalog var/list/cached_books = list() /datum/library_catalog/proc/initialize() var/newid=1 for(var/typepath in subtypesof(/obj/item/weapon/book/manual)) var/obj/item/weapon/book/B = new typepath(null) var/datum/cachedbook/CB = new() CB.forbidden = B.forbidden CB.title = B.name CB.author = B.author CB.programmatic=1 CB.path=typepath CB.id = "M[newid]" newid++ cached_books["[CB.id]"]=CB /datum/library_catalog/proc/flag_book_by_id(mob/user, id) var/global/books_flagged_this_round[0] if("[id]" in cached_books) var/datum/cachedbook/CB = cached_books["[id]"] if(CB.programmatic) to_chat(user, "That book cannot be flagged in the system, as it does not actually exist in the database.") return if("[id]" in books_flagged_this_round) to_chat(user, "This book has already been flagged this shift.") return books_flagged_this_round["[id]"] = 1 message_admins("[key_name_admin(user)] has flagged book #[id] as inappropriate.") var/sqlid = text2num(id) if(!sqlid) return var/DBQuery/query = dbcon.NewQuery("UPDATE [format_table_name("library")] SET flagged = flagged + 1 WHERE id=[sqlid]") query.Execute() /datum/library_catalog/proc/rmBookByID(mob/user, id) if("[id]" in cached_books) var/datum/cachedbook/CB = cached_books["[id]"] if(CB.programmatic) to_chat(user, "That book cannot be removed from the system, as it does not actually exist in the database.") return var/sqlid = text2num(id) if(!sqlid) return var/DBQuery/query = dbcon.NewQuery("DELETE FROM [format_table_name("library")] WHERE id=[sqlid]") query.Execute() /datum/library_catalog/proc/getBookByID(id) if("[id]" in cached_books) return cached_books["[id]"] var/sqlid = text2num(id) if(!sqlid) return var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category, content, ckey, flagged FROM [format_table_name("library")] WHERE id=[sqlid]") query.Execute() var/list/results=list() while(query.NextRow()) var/datum/cachedbook/CB = new() CB.LoadFromRow(list( "id" =query.item[1], "author" =query.item[2], "title" =query.item[3], "category"=query.item[4], "content" =query.item[5], "ckey" =query.item[6], "flagged" =query.item[7] )) results += CB cached_books["[id]"]=CB return CB return results /** Scanner **/ /obj/machinery/libraryscanner name = "scanner" icon = 'icons/obj/library.dmi' icon_state = "bigscanner" anchored = 1 density = 1 var/obj/item/weapon/book/cache // Last scanned book /obj/machinery/libraryscanner/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/book)) user.drop_item() I.forceMove(src) return 1 else return ..() /obj/machinery/libraryscanner/attack_hand(mob/user) if(istype(user,/mob/dead)) to_chat(user, "Nope.") return usr.set_machine(src) var/dat = "