diff --git a/.coverage b/.coverage deleted file mode 100644 index 279e836..0000000 Binary files a/.coverage and /dev/null differ diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index d4fa8be..0000000 --- a/.coveragerc +++ /dev/null @@ -1,2 +0,0 @@ -[run] -relative_files = true \ No newline at end of file diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 332129e..0000000 --- a/.pylintrc +++ /dev/null @@ -1,17 +0,0 @@ -[MASTER] -# Specify the maximum number of characters per line (default: 100) -max-line-length = 120 -init-hook='import sys; sys.path.append("."); sys.path.append('../')' - -[MESSAGES CONTROL] -# Enable or disable specific messages or message categories -disable = C0303, W0613, W0603, C0413 - -[FORMAT] -# Configure the output format (e.g., colorized output) -max-line-length = 120 -indent-string = " " - -[TYPECHECK] -# Set type-checking options (if using Python 3.5+ with type hints) -generated-members = __init__ diff --git a/README.md b/README.md deleted file mode 100644 index 6ccd382..0000000 --- a/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# What is kemono-watcher -On Kemono you can see artist's posts, for the sack of archiving some artist are easy as they post directly to the website and thus kemono itself. But others post links to MEGA, google drive, etc. These cannot be automated for archive programs like hyrdrus, so this program creates a manual way to archive artists and view what posts you have not yet seen. - -# Installation - -pip install -r requirements.txt - -To run, just do python application.py - -# How to use -For example, to watch https://www.patreon.com/shencomix you can use https://www.kemono.party/patreon/user/72813 as a proxy. Enter in the ID and select the website(Pateron) in the left panel and add to subscriptions. You will now see Shen or 72813 appear in the known users section at the bottom of the left input panel. Can select them in the list and hit get selected users. By default, all posts will be known but you can move them around by selecting them and moving them around. - -On the right, one can hit update unread posts and all currently unknown posts will be displayed there for all users, and the program will attempt to get all new unknown posts. This does not account for the situation where posts may have been updated past the first page but not the first page as this is probably rare and checking all pages would slow down the program. Otherwise once the list is generated, can select one or many posts and open selected post to open in the standard system web browser. - - -# Tech overview -Uses python's inbuilt tkinter to build the application and GUI. SQlite for storing everything in the database.db. And unittest to implement testing, mocking, etc. - -Coverage is used to generate coverage reports and can see the results in here(coverage %) or github actions. - -[![Coverage badge](https://raw.githubusercontent.com/caprexy/kemono-watcher/python-coverage-comment-action-data/badge.svg)](https://htmlpreview.github.io/?https://github.com/caprexy/kemono-watcher/blob/python-coverage-comment-action-data/htmlcov/index.html) - -Pylint is also the coding style used for linting, there is a pylint github action to check and make sure atleast a score above 9 out of 10. - -Borrows several github actions, see the yamls for relevant actions used diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/application.py b/application.py deleted file mode 100644 index 92f7435..0000000 --- a/application.py +++ /dev/null @@ -1,29 +0,0 @@ -"Main file to run application" - -from tkinter import Tk, PanedWindow, HORIZONTAL, BOTH, TRUE -import logging - -from input_panel import input_view -from output_panel import output_view -from models import database_model - -#enable disable logging -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') - -# setup god window -root = Tk() - -database = database_model.Database() - -# setting up root geometry -root.geometry("1000x900") - -# build main window which will be a panedwindow -mainWindow = PanedWindow(root, orient=HORIZONTAL) -mainWindow.pack(fill=BOTH, expand=TRUE) - -# add said frames -mainWindow.add(input_view.initalize_input_frame(mainWindow, database), stretch="always") -mainWindow.add(output_view.initalize_output_frame(mainWindow, database), stretch="always") - -root.mainloop() diff --git a/constants.py b/constants.py deleted file mode 100644 index 7b816a1..0000000 --- a/constants.py +++ /dev/null @@ -1,32 +0,0 @@ -"Constants used to define static information from kemono's api and database information" - -SERVICES = [ - "Patreon", - "Fanbox", - "Discord", - "Fantia", - "Afdian", - "Boosty", - "DLsite", - "Gumroad", - "SubscribeStar", -] - -DATABASE_FILENAME = "database.db" - -USERS_TABLE_NAME = "user_table" - -USER_TABLE_QUERY = f""" - CREATE TABLE {USERS_TABLE_NAME} ( - program_unique_id INTEGER PRIMARY KEY, - name TEXT, - id INTEGER, - service TEXT, - known_post_ids TEXT, - unknown_post_ids TEXT - ) - """ - -USER_TABLE_COL_NAMES =[ - "program_unique_id", "name", "id", "service", "known_post_ids", "unknown_post_ids" -] diff --git a/coverage.xml b/coverage.xml deleted file mode 100644 index ac9e0eb..0000000 --- a/coverage.xml +++ /dev/null @@ -1,639 +0,0 @@ - - - - - - C:\Users\caprexy\Downloads\github\kemono-watcher - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/database.json b/database.json deleted file mode 100644 index 89538c8..0000000 --- a/database.json +++ /dev/null @@ -1,2185 +0,0 @@ -{ - "Patreon": { - "17801042": { - "checked_post_ids": [ - "86464219", - "86464193", - "86464145", - "86016078", - "86016061", - "85992406", - "85966900", - "85966843", - "85765566", - "85765446", - "85660190", - "85660119", - "85660083", - "85228137", - "85228106", - "85228010", - "85022163", - "85022123", - "84958115", - "84958073", - "84958029", - "84649403", - "84649388", - "84645331", - "84327103", - "84326963", - "84326861", - "84137418", - "84137282", - "84137095", - "84114849", - "84014628", - "84013691", - "83966137", - "83812055", - "83783324", - "83783245", - "83590358", - "83590311", - "83375451", - "83373975", - "83373916", - "83090932", - "83090843", - "82770749", - "82770730", - "82510899", - "82510861", - "82510796", - "82456787", - "82456663", - "82398942", - "82398804", - "82149909", - "82149866", - "81995766", - "81995717", - "81757789", - "81757741", - "81292548", - "81292488", - "81084947", - "81084847", - "80982956", - "80978881", - "80959799", - "80959557", - "80620028", - "80619923", - "80489254", - "80489133", - "80016669", - "80016618", - "79804119", - "79804090", - "79654454", - "79654428", - "79654374", - "79509260", - "79509208", - "79479532", - "79479459", - "79333791", - "79333756", - "79161560", - "79161456", - "78910665", - "78826499", - "78688181", - "78688121", - "78637416", - "78637310", - "78506457", - "78506407", - "78410874", - "78410704", - "78313228", - "78313178", - "78208958", - "78208896", - "78127122", - "78127089", - "77634466", - "77634408", - "77547942", - "77547823", - "77459887", - "77459859", - "77311768", - "77311704", - "77142542", - "77142466", - "76840017", - "76839961", - "76832323", - "76795424", - "76114680", - "76114620", - "75954970", - "75954936", - "75826784", - "75826757", - "75624009", - "75623886", - "75417694", - "75314261", - "75314211", - "75151300", - "75151259", - "74980304", - "74980223", - "74819948", - "74819544", - "74702702", - "74211331", - "74211249", - "74211196", - "74211184", - "74112052", - "74112038", - "73814653", - "73814621", - "73712882", - "73712823", - "73580295", - "73580182", - "73419837", - "73419798", - "73285588", - "73273072", - "73273039", - "73171939", - "72931456", - "72931437", - "72901915", - "72899814", - "72842279", - "72842246", - "72335716", - "72335685", - "72321476", - "72321451", - "72110509", - "72109790", - "72050142", - "72017397", - "72017354", - "71895204", - "71895150", - "71554449", - "71552433", - "71552376", - "71453113", - "71452798", - "71030529", - "71030488", - "70875205", - "70875163", - "70614241", - "70613879", - "70390257", - "70388653", - "70291761", - "70291717", - "70195427", - "70015817", - "69981544", - "69981472", - "69725016", - "69280991", - "69280896", - "69147114", - "69146868", - "68743513", - "68743467", - "68549875", - "68549843", - "68521552", - "68521432", - "68304497", - "68304467", - "68063637", - "68063603", - "67858682", - "67858665", - "67842444", - "67842344", - "67474869", - "67474844", - "67323122", - "67323109", - "67227354", - "67227322", - "67227138", - "67193426", - "67193385", - "67027613", - "66936608", - "66936572", - "66843164", - "66843122", - "66501099", - "66500974", - "66500717", - "66500686", - "66310193", - "66310172", - "66213656", - "66213633", - "66047761", - "66047742", - "65907698", - "65907663", - "65886926", - "65886887", - "65886811", - "65688072", - "65599432", - "65599414", - "65363260", - "65363238", - "65231166", - "65231145", - "65162515", - "65162465", - "65162452", - "65092757", - "65092720", - "64947150", - "64947136", - "64894978", - "64894853", - "64613714", - "64613655", - "64611619", - "64611451", - "64611432", - "64287548", - "64263391", - "64217502", - "64217456", - "63886733", - "63886681", - "63885286", - "63881473", - "63804947", - "63804919", - "63696479", - "63696439", - "63588458", - "63588340", - "63491510", - "63491311", - "63389199", - "63389163", - "63304912", - "63304838", - "63302161", - "63274893", - "63274809", - "63103683", - "63064986", - "62950574", - "62950528", - "62900675", - "62857242", - "62857197", - "62759698", - "62689509", - "62689477", - "62628661", - "62628593", - "62554351", - "62554323", - "62382423", - "62352061", - "62351349", - "62337701", - "62264587", - "62161476", - "62161421", - "62068984", - "62068909", - "62015558", - "62015520", - "61992387", - "61770612", - "61770581", - "61582925", - "61582851", - "61373648", - "61373611", - "61215046", - "61214941", - "61113105", - "61113069", - "61067741", - "61027985", - "61027946", - "60917137", - "60833209", - "60833185", - "60725225", - "60725200", - "60682582", - "60682462", - "60654682", - "60630569", - "60630539", - "60629428", - "60549688", - "60409811", - "59973976", - "59973406", - "59949448", - "59861793", - "59713429", - "59532017", - "59531399", - "59531283", - "59429785", - "59087709", - "58758817", - "58498728", - "58416084", - "58206304", - "58206091", - "58104656", - "57887114", - "57423418", - "57423398", - "57187509", - "56986753", - "56928392", - "56928376", - "56874292", - "56762964", - "56714969", - "56484288", - "56411446", - "56272688", - "56166121", - "55702626", - "55659600", - "55420521", - "55051392", - "55010455", - "54744785", - "54724473", - "54601872", - "54476022", - "54475511", - "54474289", - "54428188", - "54175847", - "53796383", - "53664827", - "53410908", - "53325743", - "53223158", - "53170516", - "52961333", - "52723388", - "52674234", - "52576363", - "52438150", - "52381273", - "52360426", - "52350526", - "52109061", - "52108587", - "52030302", - "52015998", - "51806068", - "51736561", - "51469693", - "51469411", - "51469387", - "51325907", - "51322332", - "51266335", - "51151266", - "51094449", - "51087686", - "50787462", - "50723872", - "50585683", - "50466006", - "50246911", - "50246896", - "50198464", - "50052159", - "49848727", - "49655377", - "49655342", - "49539514", - "49539440", - "49378968", - "49104292", - "49104134", - "49104078", - "48691585", - "48531794", - "48513035", - "48332382", - "48265012", - "48088965", - "47924165", - "47756460", - "47667704", - "47440039", - "47277179", - "47134293", - "47067151", - "47027492", - "46830421", - "46796826", - "46696887", - "46645624", - "46567755", - "46430002", - "46429795", - "46209162", - "46036858", - "45972070", - "45952330", - "45952306", - "45897907", - "45412778", - "45055563", - "45042281", - "44957096", - "44938261", - "44785162", - "44770786", - "44732225", - "44606353", - "44477629", - "44477563", - "44355743", - "44296698", - "44296600", - "44258050", - "44241715", - "44044593", - "44044564", - "43982776", - "43770455", - "43711556", - "43617549", - "43536068", - "43505481", - "43466734", - "43239649", - "43213758", - "43041418", - "43041385", - "42855357", - "42733682", - "42733512", - "42341402", - "42341354", - "42208807", - "42207891", - "42131364", - "42130698", - "42067590", - "41910670", - "41909640", - "41726539", - "41561940", - "41436014", - "41371835", - "41310375", - "41256008", - "41161001", - "41115292", - "41052014", - "41007248", - "40982023", - "40865681", - "40857304", - "39861549", - "39298440", - "39093957", - "39056001", - "38796653", - "38777183", - "38699101", - "38171577", - "37819025", - "37610413", - "37590546", - "37355105", - "37176187", - "37129398", - "36963602", - "36648683", - "36318351", - "36139369", - "35890655", - "35470841", - "35328963", - "35315243", - "35134006", - "34467440", - "34259166", - "34069306", - "33783509", - "33550930", - "33490922", - "33279363", - "33116122", - "33048771", - "32214144" - ], - "unchecked_post_ids": [ - "87737081", - "87470696", - "87470700", - "87342624", - "86686971", - "86686257" - ] - }, - "4314103": { - "checked_post_ids": [ - "9590300", - "8840390", - "87079181", - "87079181", - "87079181", - "87079181", - "87079181", - "87079181", - "87079181", - "87079181", - "8637377", - "8571245", - "8565198", - "8542887", - "85367405", - "8448710", - "8433176", - "8399208", - "8364143", - "8339606", - "8327449", - "8312466", - "8278720", - "8237275", - "8193437", - "8133392", - "8103021", - "8073292", - "8037274", - "8005820", - "7956195", - "7834141", - "7777741", - "77366137", - "7633199", - "7625606", - "71310702", - "67145930", - "66868666", - "65458194", - "64585469", - "62850496", - "62231189", - "60530065", - "60092167", - "58770122", - "58346184", - "57498646", - "56580640", - "55509908", - "55171577", - "54695972", - "53863793", - "53016876", - "51903255", - "51550611", - "51057509", - "50712801", - "50543371", - "49796666", - "49240198", - "48827469", - "47997018", - "46838470", - "45631235", - "43861033", - "43003644", - "40991201", - "39874078", - "39302735", - "39240919", - "38776772", - "38757086", - "38633231", - "37737969", - "36815147", - "36170211", - "35331980", - "35007181", - "34456590", - "34248893", - "33197912", - "32744064", - "32613418", - "32293302", - "31970784", - "31460866", - "31200880", - "31039577", - "30850366", - "30368327", - "29595828", - "29386093", - "29314808", - "29107974", - "28800164", - "28567073", - "28414214", - "28245395", - "28049817", - "27867234", - "27750422", - "27358395", - "27101482", - "26904071", - "26455017", - "26051657", - "25965108", - "25761698", - "25452159", - "25274248", - "25225228", - "24975587", - "24808357", - "24586927", - "24363940", - "24228420", - "23952307", - "23793504", - "23490708", - "23203892", - "22552605", - "22181049", - "22082529", - "21802202", - "21723385", - "21371282", - "21111136", - "20775897", - "20049584", - "19855780", - "19647566", - "19569061", - "19468853", - "19345337", - "19028950", - "18923163", - "18527905", - "18294696", - "17804403", - "17358291", - "17297825", - "16719004", - "16394545", - "15997351", - "15849964", - "15849592", - "15782431", - "15585632", - "15556679", - "15245767", - "15123678", - "15093172", - "14722709", - "14576985", - "14430121", - "14164763", - "14057817", - "13980838", - "13727675", - "13618855", - "13474856", - "13214235", - "13186791", - "12849335", - "12472411", - "12313687", - "12137534", - "12030013", - "11973795", - "11863371", - "11815320", - "11771370", - "11753886", - "11541153", - "11278560", - "11131714", - "10222728" - ], - "unchecked_post_ids": [ - "87079181" - ] - }, - "6592200": { - "checked_post_ids": [ - "87674607", - "87631415", - "87631403", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278933", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278835", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87278725", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87185457", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017711", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "87017614", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86891927", - "86633276", - "86533250", - "86533235", - "86278541", - "86231089", - "86189504", - "85834774", - "85834773", - "85290385", - "85289825", - "85100013", - "85077731", - "85058662", - "84757150", - "84757146", - "84656079", - "84407830", - "84407829", - "84052475", - "84052469", - "83843089", - "83776173", - "83674917", - "83674916", - "83325220", - "83325219", - "83240321", - "82993264", - "82993263", - "82993262", - "82645669", - "82645584", - "82338553", - "82336550", - "82277942", - "82277933", - "82231440", - "81933325", - "81933324", - "81643204", - "81598989", - "81598982", - "81266391", - "81266003", - "80929486", - "80929480", - "80834975", - "80834188", - "80569195", - "80527657", - "80476885", - "80474446", - "80280150", - "80235720", - "79915999", - "79915918", - "79834282", - "79585578", - "79427513", - "79400912", - "79236119", - "79236114", - "79150967", - "78912438", - "78912224", - "78912215", - "78857293", - "78732152", - "78618292", - "78618158", - "78618157", - "78481061", - "78262408", - "78225312", - "78018259", - "78018150", - "77906015", - "77864725", - "77712515", - "77630830", - "77630829", - "77410367", - "77263923", - "77225416", - "76954497", - "76954496", - "76510615", - "76510152", - "76497040", - "76355072", - "76283866", - "76108017", - "76071349", - "75778823", - "75645632", - "75606615", - "75488733", - "75488728", - "75455065", - "75354984", - "75243512", - "75167275", - "75161652", - "75155910", - "74887870", - "74887865", - "74851510", - "74670878", - "74639716", - "74595613", - "74595604", - "74298983", - "74168482", - "74019299", - "74018919", - "73897057", - "73704140", - "73704133", - "73704130", - "73704127", - "73704120", - "73445217", - "73374949", - "73374940", - "73077308", - "73077303", - "72773028", - "72773023", - "72668409", - "72666127", - "72450276", - "72450270", - "72145559", - "72145503", - "72022411", - "71913547", - "71825386", - "71825378", - "71505915", - "71505909", - "71463737", - "71463563", - "71152530", - "71152528", - "71152525", - "70956815", - "70826101", - "70826099", - "70504458", - "70504442", - "70226317", - "70180364", - "70180350", - "69832240", - "69832232", - "69597920", - "69465381", - "69342183", - "69242238", - "69037885", - "69037773", - "68994005", - "68905976", - "68905972", - "68905970", - "68859111", - "68603244", - "68569041", - "68569038", - "68568971", - "68459561", - "68409205", - "68310658", - "68310657", - "68278101", - "68278091", - "68130212", - "68104482", - "68104477", - "67973025", - "67973013", - "67939278", - "67939272", - "67771083", - "67678682", - "67678680", - "67644575", - "67644572", - "67373859", - "67373856", - "67331265", - "67279351", - "67087406", - "67033578", - "67033576", - "67001225", - "67001220", - "66738845", - "66738844", - "66707768", - "66492819", - "66453794", - "66453439", - "66288492", - "66288462", - "66156562", - "66156561", - "66125487", - "66125480", - "66125473", - "66125467", - "66125463", - "65854708", - "65854699", - "65854693", - "65854683", - "65852247", - "65836669", - "65810327", - "65540780", - "65540668", - "65246299", - "65246290", - "65176477", - "65176381", - "64994679", - "64960932", - "64960917", - "64664756", - "64664715", - "64622889", - "64337694", - "64326532", - "64256247", - "64076519", - "63958888", - "63770768", - "63740964", - "63473471", - "63446628", - "63329267", - "63313275", - "63227649", - "63115882", - "63077893", - "62861633", - "62817562", - "62817560", - "62502950", - "62473116", - "62246126", - "62196817", - "62162023", - "61903876", - "61848484", - "61815803", - "61708553", - "61572900", - "61541850", - "61509120", - "61406298", - "61372477", - "61357071", - "61322115", - "61239155", - "61228496", - "60961914", - "60961913", - "60934618", - "60908495", - "60684930", - "60634958", - "60590493", - "60509838", - "60472013", - "60356316", - "60356225", - "60326469", - "60104451", - "60034536", - "59828735", - "59828711", - "59798763", - "59591459", - "59470765", - "59325921", - "59276039", - "59235970", - "59203993", - "58934398", - "58905167", - "58734866", - "58660807", - "58410999", - "58383948", - "58109788", - "58069792", - "57800748", - "57800710", - "57756748", - "57725235", - "57634125", - "57593025", - "57513423", - "57473355", - "57386238", - "57234227", - "57193757", - "56975143", - "56952581", - "56952553", - "56933934", - "56899629", - "56786019", - "56635409", - "56548986", - "56544598", - "56426463", - "56391866", - "56276191", - "56259956", - "56259868", - "56075431", - "56043265", - "55797951", - "55667826", - "55575219", - "55478333", - "55474554", - "55474297", - "55474271", - "55210041", - "55210009", - "55007260", - "55006706", - "54932710", - "54890976", - "54812933", - "54690282", - "54689459", - "54666576", - "54471733", - "54324123", - "54095070", - "53833169", - "53558678", - "53286046", - "52991069", - "52718255", - "52448947", - "52177554", - "51870331", - "51596771", - "51596608", - "51320237", - "51051991", - "50758193", - "50458907", - "50458877", - "50182824", - "49898961", - "49614931", - "49614811", - "49304505", - "49019287", - "48741406", - "48446042", - "48445935", - "48175867", - "48083065", - "47824682", - "47535462", - "47238109", - "46903092", - "46604292", - "46601009", - "46318694", - "46034429", - "46034305", - "45748884", - "45594199", - "45593561", - "45485516", - "45268025", - "45268011", - "45249166", - "44989605", - "44989574", - "44730239", - "44440742", - "44182501", - "43925480", - "43665639", - "43407679", - "43133648", - "42884796", - "42626497", - "42355219", - "42355017", - "42074914", - "41840223", - "41556336", - "41303883", - "41021162", - "40765608", - "40627806", - "40517551", - "40266853", - "40005903", - "40005807", - "40003792", - "39728118", - "39728007", - "39477845", - "39477824", - "39239506", - "39239489", - "39009744", - "39009689", - "38994665", - "38705695", - "38705655", - "38463695", - "38462890", - "38224312", - "37982489", - "37731629", - "37470595", - "37219130", - "36974362", - "36702744", - "36702598", - "36419316", - "36166119", - "35915556", - "35668081", - "35668029", - "35415672", - "35415653", - "35141322", - "35141275", - "34904639", - "34904591", - "34698728", - "34698714", - "34477506", - "34477455", - "34477411", - "34477365", - "34268354", - "34075644", - "33898579", - "33898434", - "33898187", - "33674568", - "33674410", - "33488358", - "33466098", - "33276023", - "33084708", - "32889683", - "32750992", - "32691894", - "32541719", - "32368046", - "32189567", - "31995525", - "31815625", - "31632643", - "31458655", - "31275554", - "31081247", - "30899982", - "30725104", - "30542999", - "30332981", - "30153476", - "29981680", - "29807413", - "29619232", - "29430100", - "29430019", - "29274479", - "29274458", - "29252211", - "29082828", - "29082804", - "28907293", - "28907267", - "28710210", - "28709528", - "28538852", - "28369878", - "28198304", - "28018505", - "27841616", - "27841568", - "27674185", - "27505499", - "27323616", - "27141396", - "26972362", - "26803665", - "26615799", - "26615704", - "26420788", - "26280875", - "26095168", - "25939936", - "25763273", - "25763213", - "25615880", - "25598599", - "25432545", - "25432532", - "25270717", - "25101225", - "25027430", - "24920770", - "24762613", - "24601255", - "24392648", - "24261590", - "24103167", - "24103159", - "24103135", - "23913935", - "23913810", - "23910370", - "23839907", - "23792210", - "23654947", - "23474288", - "23474060", - "23345687", - "23345591", - "23220206", - "23071480", - "22916028", - "22785247", - "22647474", - "22506999", - "22347624", - "22347599", - "22177365", - "22177328", - "22055892", - "21968735", - "21907887", - "21907808", - "21717968", - "21717966", - "21717943", - "21717887", - "21631174", - "21624710", - "21587502", - "21449120", - "21305025", - "21305017", - "21305005", - "21304998", - "21304986", - "21133586", - "20387726", - "20387429", - "20387364", - "20387349", - "20263886", - "20263848", - "20232140", - "20082864", - "20082856", - "19938963", - "19938948", - "19833710", - "19793365", - "19642262", - "19642254", - "19503589", - "19503579", - "19485580", - "19362970", - "19362961", - "19218254", - "19218240", - "19060516", - "19060504", - "18916007", - "18915926", - "18799008", - "18798971", - "18653616", - "18653580", - "18653573", - "18653564", - "18653553", - "18454334", - "18332947", - "18332918", - "18192397", - "18192383", - "18192112", - "18053181", - "18053167", - "18053148", - "17896274", - "17896177", - "17761704", - "17761690", - "17624919", - "17624908", - "17624866", - "17491805", - "17491798", - "17354103", - "17354090", - "17197033", - "17197027", - "17181765", - "17086582", - "17086566", - "16881238", - "16795766", - "16795753", - "16652143", - "16652136", - "16633797", - "16522888", - "16522847", - "16394756", - "16394733", - "16394695", - "16262347", - "16262325", - "16219488", - "16093896", - "16093870", - "16093856", - "16026879", - "16026848", - "15927022", - "15926987", - "15809314", - "15809305", - "15683017", - "15683009", - "15550562", - "15550558", - "15550550", - "15447291", - "15447260", - "15446270", - "15446268", - "15333141", - "15333122", - "15333104", - "15223587", - "15223580", - "15223520", - "15098268", - "15098258", - "14991300", - "14991272", - "14991265", - "14991254", - "14876392", - "14876386", - "14796752", - "14779566", - "14779523", - "14779511", - "14733753", - "14637540", - "14637433", - "14637403", - "14525790", - "14525777", - "14525754", - "14462014", - "14417236", - "14417233", - "14417221", - "14311176", - "14311160", - "14196674", - "14196666", - "14071469", - "14071462", - "14071456", - "13953816", - "13953785", - "13870446", - "13870416", - "13870360", - "13834097", - "13834094", - "13834085", - "13699409", - "13676201", - "13676184", - "13552506", - "13552391", - "13526134", - "13526111", - "13526091", - "13234863", - "13234794", - "13234769", - "13029821", - "13029797", - "12755933", - "12755898", - "12755803", - "12402698", - "12402352", - "12402228", - "12174896", - "12174845", - "12174755", - "12068909", - "12068525", - "12068473", - "12068431", - "12068284", - "12067671" - ], - "unchecked_post_ids": [] - }, - "6185029": { - "checked_post_ids": [ - "86917620", - "85328617", - "84949663", - "83824401", - "81784576", - "80818133", - "79224509", - "78719992", - "78719990", - "78001928", - "76585809", - "75204618", - "75204615", - "73405095", - "72673608", - "70540422", - "69773126", - "67671581", - "67123258", - "65532990", - "64326693", - "62498183", - "61842075", - "59817263", - "59276881", - "58009225", - "57973797", - "57542819", - "56703449", - "56265396", - "55476527", - "55003570", - "55002583", - "53821533", - "53210370", - "53063965", - "52712100", - "52321088", - "51866290", - "51679088", - "51678526", - "51314995", - "50929456", - "50929455", - "50620295", - "50569339", - "50569321", - "50098846", - "49387657", - "49387580", - "48941117", - "48318413", - "47697646", - "47697637", - "47663519", - "46599502", - "46313390", - "45987168", - "45228339", - "44361252", - "43607886", - "43486998", - "43326363", - "43021962", - "42990189", - "42847785", - "41610912", - "41040435", - "40586181", - "40079969", - "39623884", - "39267233", - "38781324", - "38781264", - "38738019", - "38254328", - "38220219", - "37208590", - "36568428", - "35912720", - "35461854", - "34844876", - "34725697", - "34411920", - "34049821", - "33547833", - "33437307", - "33437306", - "33196621", - "32746232", - "32604466", - "32320391", - "32222413", - "31889744", - "31609869", - "31586074", - "31384675", - "31265194", - "30682317", - "29886052", - "29615020", - "29553613", - "29553064", - "29208397", - "28983445", - "28792359", - "28792063", - "28709703", - "28390515", - "28390478", - "28104536", - "27941047", - "27940922", - "27940792", - "27888916", - "27574523", - "27380072", - "27239688", - "27043564", - "26987208", - "26673677", - "26500974", - "26106658", - "26029310", - "25404626", - "24719363", - "23985897", - "23793091", - "23531837", - "23520838", - "23491162", - "23202958", - "22932827", - "22468624", - "22333730", - "22221830", - "22094382", - "21627583", - "20961960", - "20848103", - "20839807", - "20636002", - "20196973", - "20018354", - "19787574", - "19624143", - "19416983", - "19135511", - "19067315", - "18960630", - "18724875", - "18723784", - "18489321", - "18476419", - "18303818", - "18095390", - "17866173", - "17678928", - "17445918", - "17303972", - "17194161", - "17086215", - "16974966", - "16731849", - "16591214", - "16353414", - "16182847", - "16079878", - "16028228", - "15982509", - "15894388", - "15831894", - "15756584", - "15722822", - "15663819", - "15663222", - "15611438", - "15541929", - "15439830", - "15360914", - "15324319", - "15283091", - "15192400", - "15132163", - "15058160", - "14991456", - "14951332", - "14906348", - "14864354", - "14740872", - "14720076", - "14692838", - "14678625", - "14584220", - "14499753", - "14421497", - "14398013", - "14326133", - "14322438", - "14301502", - "14258131", - "14241066", - "14217515", - "14204520", - "14186761", - "14166107", - "14147308", - "14136377", - "14089779", - "14089673", - "14059554", - "14028212", - "14014534", - "13995066", - "13980261", - "13980078", - "13956462", - "13933560", - "13926970", - "13925550", - "13900241", - "13870799", - "13870762", - "13828125", - "13828088", - "13799722", - "13797153", - "13765846", - "13765779", - "13765769", - "13765742", - "13682693", - "13682394", - "13587287", - "13587132", - "13586819", - "13586668", - "13586554", - "13586503", - "13586436", - "13586262", - "13583844", - "13183354" - ], - "unchecked_post_ids": [] - } - }, - "Fanbox": { - "16731": { - "checked_post_ids": [ - "6530470", - "6529842", - "6430447", - "6423390", - "6292232", - "6222769", - "6211296", - "6195718", - "6154028", - "6081336", - "5927583", - "5846533", - "5721891", - "5708729", - "5614805", - "5461722", - "5358483", - "5339782", - "5319985", - "5200203", - "5173232", - "5128070", - "5048700", - "4998145", - "4971755", - "4952586", - "4853799", - "4781667", - "4694008", - "4591925", - "4551234", - "4471879", - "4385975", - "4331705", - "4293065", - "4198962", - "4151539", - "4119817", - "4022478", - "3984811", - "3957758", - "3869721", - "3809726", - "3765185", - "3710548", - "3684593", - "3629298", - "3445415", - "3411358", - "3382090", - "3351033", - "3350521", - "3307294", - "3258753", - "3217447", - "3217469", - "3139024", - "3106295", - "2982072", - "2946894", - "2900535", - "2869535", - "2836665", - "2784706", - "2728066", - "2679436", - "2641057", - "2637084", - "2624305", - "2592518", - "2533231", - "2516965", - "2491922", - "2464176", - "2416624", - "2372102", - "2328263", - "2328177", - "2256379", - "2218978", - "2196658", - "2140660", - "2140481", - "2105768", - "2053846", - "2053099", - "2044477", - "2030675", - "1986033", - "1954495", - "1943375", - "1890364", - "1890305", - "1843814", - "1785583", - "1732864", - "1720183", - "1705644", - "1659264", - "1651105", - "1613337", - "1586103", - "1536392", - "1523009", - "1488366", - "1470139", - "1439770", - "1409096", - "1379523", - "1365045", - "1346060", - "1330555", - "1328681", - "1307319", - "1298772", - "1297965", - "1285473", - "1237683", - "1211074", - "1191068", - "1174636", - "1157630", - "1138500", - "1118946", - "1115759", - "1094699", - "1081092", - "1079289", - "1050202", - "1050153", - "1013744", - "989582", - "989532", - "972373", - "972321", - "960680", - "960560", - "955579", - "938449", - "933416", - "910015", - "880110", - "856300", - "842807", - "823472", - "809997", - "784260", - "771594", - "753406", - "732917", - "711894", - "698003", - "681214", - "669083", - "643567", - "643541", - "627599", - "612262", - "599132", - "593699", - "585605", - "562776", - "556750", - "551918", - "547321", - "542125", - "519103", - "515102", - "505461", - "494632", - "481106", - "462243", - "455446", - "425396", - "418758", - "410455", - "406287", - "394106", - "382876", - "379255", - "359809", - "355783", - "355323", - "348822", - "336492", - "325340", - "321084", - "319489", - "306570", - "283897", - "266896", - "258816", - "252360", - "245469", - "239836", - "231541", - "227908", - "216301", - "213560", - "206463", - "198028", - "193009", - "188409", - "184558", - "182813", - "179414", - "178564", - "172248", - "170510", - "164734", - "160404", - "155863", - "155807", - "154667", - "151213", - "146329", - "143354", - "141073", - "130990", - "130350", - "122019", - "119809", - "115280", - "103114", - "99461", - "96330", - "93895", - "88592", - "87362", - "84452", - "81547", - "79946", - "78418", - "75234", - "72838", - "72706" - ], - "unchecked_post_ids": [] - } - }, - "Discord": {}, - "Fantia": {}, - "Afdian": {}, - "Boosty": {}, - "DLsite": {}, - "Gumroad": {}, - "SubscribeStar": {} -} \ No newline at end of file diff --git a/input_panel/__init__.py b/input_panel/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/input_panel/__pycache__/__init__.cpython-310.pyc b/input_panel/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 9451617..0000000 Binary files a/input_panel/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/__init__.cpython-311.pyc b/input_panel/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 7f6671d..0000000 Binary files a/input_panel/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/input_panel/__pycache__/inputController.cpython-310.pyc b/input_panel/__pycache__/inputController.cpython-310.pyc deleted file mode 100644 index 413251c..0000000 Binary files a/input_panel/__pycache__/inputController.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/inputController.cpython-311.pyc b/input_panel/__pycache__/inputController.cpython-311.pyc deleted file mode 100644 index 73bb45b..0000000 Binary files a/input_panel/__pycache__/inputController.cpython-311.pyc and /dev/null differ diff --git a/input_panel/__pycache__/inputFrameHelper.cpython-310.pyc b/input_panel/__pycache__/inputFrameHelper.cpython-310.pyc deleted file mode 100644 index 09b3b3a..0000000 Binary files a/input_panel/__pycache__/inputFrameHelper.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/inputView.cpython-310.pyc b/input_panel/__pycache__/inputView.cpython-310.pyc deleted file mode 100644 index ae82d53..0000000 Binary files a/input_panel/__pycache__/inputView.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/inputView.cpython-311.pyc b/input_panel/__pycache__/inputView.cpython-311.pyc deleted file mode 100644 index db95c28..0000000 Binary files a/input_panel/__pycache__/inputView.cpython-311.pyc and /dev/null differ diff --git a/input_panel/__pycache__/input_controller.cpython-310.pyc b/input_panel/__pycache__/input_controller.cpython-310.pyc deleted file mode 100644 index 5810a45..0000000 Binary files a/input_panel/__pycache__/input_controller.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/input_view.cpython-310.pyc b/input_panel/__pycache__/input_view.cpython-310.pyc deleted file mode 100644 index 94b7918..0000000 Binary files a/input_panel/__pycache__/input_view.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/operationHelper.cpython-310.pyc b/input_panel/__pycache__/operationHelper.cpython-310.pyc deleted file mode 100644 index 6035d46..0000000 Binary files a/input_panel/__pycache__/operationHelper.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/statusHelper.cpython-310.pyc b/input_panel/__pycache__/statusHelper.cpython-310.pyc deleted file mode 100644 index f9461cb..0000000 Binary files a/input_panel/__pycache__/statusHelper.cpython-310.pyc and /dev/null differ diff --git a/input_panel/__pycache__/statusHelper.cpython-311.pyc b/input_panel/__pycache__/statusHelper.cpython-311.pyc deleted file mode 100644 index b4136f1..0000000 Binary files a/input_panel/__pycache__/statusHelper.cpython-311.pyc and /dev/null differ diff --git a/input_panel/__pycache__/status_helper.cpython-310.pyc b/input_panel/__pycache__/status_helper.cpython-310.pyc deleted file mode 100644 index 850ed4d..0000000 Binary files a/input_panel/__pycache__/status_helper.cpython-310.pyc and /dev/null differ diff --git a/input_panel/input_controller.py b/input_panel/input_controller.py deleted file mode 100644 index ceecb4f..0000000 --- a/input_panel/input_controller.py +++ /dev/null @@ -1,299 +0,0 @@ -""" All functions needed for the view, and calls the database to modify it """ -import threading -import tkinter -import webbrowser -import logging - -from models.database_model import Database -from . import status_helper - -# pylint: disable=C0103 -id_entry_ele = None -selected_service = None - -add_button = None -known_posts_list_var = None -unknown_posts_list_var = None - -known_posts_list_box = None -unknown_posts_list_box = None - -known_user_list_var = None -known_user_list_box = None - -database = None -# pylint: enable=C0103 - -def initalize(database_in: Database): - """Called to setup database to be used by the controller and anything else necessary - Args: - database_in (Database): _description_ - """ - global database - database = database_in - - update_known_list() - -###### -## set needed elements from the frame -# pylint: disable=C0116 -def set_service_and_user_id_ele(selected_service_var, user_id_ele): - global id_entry_ele, selected_service - selected_service = selected_service_var - id_entry_ele = user_id_ele - -def set_add_button(add_button_in): - global add_button - add_button = add_button_in - -def set_known_post_var_list(known_posts_list_var_in, known_posts_list_box_in): - global known_posts_list_var, known_posts_list_box - - known_posts_list_var = known_posts_list_var_in - known_posts_list_box = known_posts_list_box_in - -def set_unknown_post_var_list(unknown_posts_list_var_in, unknown_posts_list_box_in): - global unknown_posts_list_var, unknown_posts_list_box - - unknown_posts_list_var = unknown_posts_list_var_in - unknown_posts_list_box = unknown_posts_list_box_in - -def set_display_users(known_user_list_var_in, known_user_list_box_in): - global known_user_list_box, known_user_list_var - - known_user_list_var = known_user_list_var_in - known_user_list_box = known_user_list_box_in -# pylint: enable=C0116 -###### - - -# actual operations -def add_user(): - """Adds a user and handles all UI changes required to do so - """ - add_button["state"] = "disabled" - user = id_entry_ele.get() - service = selected_service.get() - - logging.info("Trying to add a user") - - if len(user) == 0: - status_helper.set_user_operation_status_values("Missing Id!", "red") - add_button["state"] = "normal" - return - if not user.isnumeric(): - status_helper.set_user_operation_status_values("Non numeric id!", "red") - add_button["state"] = "normal" - return - - if database.does_user_exist(user, service): - status_helper.set_user_operation_status_values("User already exists!", "red") - add_button["state"] = "normal" - else: - threading.Thread(target=database.create_user, args=(user, service, add_button, update_operation_panel)).start() - view_user_info() - update_known_list() - -def update_operation_panel(): - """Central function to be called when UI eles on input panel needs to be updated and not done in function - (ex: status change) - """ - view_user_info() - update_known_list() - -def clear_operation_panel(): - """Clears out any information in the input panel - """ - id_entry_ele.delete(0, tkinter.END) - known_posts_list_var.set([]) - unknown_posts_list_var.set([]) - update_known_list() - - -def view_user_info(): - """Tries to view a user and set all according input panel elements - """ - - logging.info("Trying to view a user") - - user_id = id_entry_ele.get() - service = selected_service.get() - - user_obj = database.get_user_obj(user_id, service) - if user_obj is None: - status_helper.set_user_operation_status_values("Couldnt find user!", "red") - return - - logging.info("Got user %s", str(user_obj)) - known_posts_list_var.set(user_obj.checked_post_ids) - unknown_posts_list_var.set(user_obj.unchecked_post_ids) - - status_helper.set_user_operation_status_values("Got user!", "green") - - -def delete_user(): - """Called when deleting a user, starts the deletion call and updates UI elements - """ - user = id_entry_ele.get() - service = selected_service.get() - if database.does_user_exist(user, service) == []: - status_helper.set_user_operation_status_values("Couldnt find user to delete", "orange") - else: - database.delete_user(user, service, clear_operation_panel) - -def get_selected_users(): - """Called when trying to open a user and updates corresponding UI elements - """ - if known_user_list_box.curselection() is (): - return - - users = format_str_var_to_strlist(known_user_list_var) - - selected_val = users[known_user_list_box.curselection()[0]] - - service, selected_user = selected_val.split(":") - - selected_service.set(service) - id_entry_ele.delete(0, tkinter.END) - id_entry_ele.insert(0, selected_user) - view_user_info() - -def update_known_list(): - """Called to update the known users UI element - """ - user_list = database.get_all_user_id_and_services() # PLEASE REWRITE TO NOT CALL THE DATABASE - known_users = [] - for user in user_list: - known_users.append(f"{user[1]}:{user[0]}") - known_user_list_var.set(known_users) - -def open_user_page(): - """Called to open the current user in website form - """ - user = id_entry_ele.get() - service = selected_service.get() - if not database.does_user_exist(user, service): - return - webbrowser.open("https://kemono.party/"+service.lower()+"/user/"+user) - -def format_str_var_to_strlist(str_var)->list[str]: - """Utility function to handle the stringVar from tk and convert into list - - Args: - str_var (_type_): tk's stringvar - - Returns: - list[str]: list of str - """ - new_list = [] - if len( str_var.get()) != 0: - new_list = str_var.get()[1:-1].replace('\'','').replace(' ','').split(",") - if new_list[-1] == '': - new_list.pop() - return new_list - - -def move_from_known_to_unknown(): - """Takes the selected value in the known and unknown listbox and moves it between lists - """ - known_list, unknown_list = get_known_and_unknown_lists() - - known_list, unknown_list = move_from_a_to_b(known_list, unknown_list, known_posts_list_box.curselection()) - - set_known_and_unknown_lists(unknown_list, known_list) - -def move_from_unknown_to_known(): - """Takes the selected value in the known and unknown listbox and moves it between lists - """ - known_list, unknown_list = get_known_and_unknown_lists() - - unknown_list, known_list = move_from_a_to_b(unknown_list, known_list, unknown_posts_list_box.curselection()) - - set_known_and_unknown_lists(unknown_list, known_list) - - -def move_from_a_to_b(a: list, b: list, a_selections: tuple): - """Moves elements from list a to list b - - Args: - a (list): sending list - b (list): reciving list - a_selections (tuple): element to move from a to b - - Returns: - list,list: the new a and b list - """ - if a_selections is (): - return [],[] - - selected_ids = [] - for selected_index in a_selections: - selected_ids.append(a[selected_index]) - - for some_id in selected_ids: - b.append(some_id) - a.remove(some_id) - - a.sort() - a.reverse() - - b.sort() - b.reverse() - - return a, b - -def get_known_and_unknown_lists(): - """Simply returns the known and unknown posts thats currently on the UI (NOT DATABASE) - - Returns: - list, list: known, unknown posts list according to the UI - """ - known_list = [] - unknown_list = [] - - known_list = format_str_var_to_strlist(known_posts_list_var) - unknown_list = format_str_var_to_strlist(unknown_posts_list_var) - - return known_list, unknown_list - -def set_known_and_unknown_lists(unknown, known): - """Sets the known and unknown listVar for the UI based on the inputted lists - - Args: - unknown (list): list of str - known (list): list of str - """ - if unknown == [] and known == []: - return - - known_posts_list_var.set(known) - unknown_posts_list_var.set(unknown) - - # updating the database and user_obj - user_id = id_entry_ele.get() - service = selected_service.get() - - user_obj = database.get_user_obj(user_id, service) - - # error checking to ensure the total values are still the same - new_list = known + unknown - new_list.sort() - - if user_obj.checked_post_ids == "": - user_obj.checked_post_ids = [] - if user_obj.unchecked_post_ids == "": - user_obj.unchecked_post_ids = [] - - old_list = user_obj.checked_post_ids + user_obj.unchecked_post_ids #this returns int so need to convert to str - old_list.sort() - old_list = [ str(x) for x in old_list ] - - if new_list != old_list: - logging.error("When trying to update the post lists, frontend != backend!") - return - - user_obj.checked_post_ids = known - user_obj.unchecked_post_ids = unknown - - database.update_database_row_user_object(user_obj) - \ No newline at end of file diff --git a/input_panel/input_view.py b/input_panel/input_view.py deleted file mode 100644 index cd0ba64..0000000 --- a/input_panel/input_view.py +++ /dev/null @@ -1,208 +0,0 @@ -""" Is the panel for most main user input""" -from tkinter import ttk, Frame, Label, StringVar, \ - OptionMenu, E,W, Entry, Button, HORIZONTAL, Listbox -import constants - -from . import input_controller -from . import status_helper - -# pylint: disable=C0103 -# frames operated in -parent_frame = None -input_frame = None - -# various widgets in need of saving -selected_service_var = None - -id_entry_element = None -view_add_id_status_label = None - -# operation options -options = constants.SERVICES -# pylint: enable=C0103 - -def initalize_input_frame(root_in, database): - """Initalizes all globals and frames for the input frame - - Args: - root_in (_type_): the parent tk panel that is the god tk panel - database (_type_): the singular database created - - Returns: - _type_: tk frame of the input - """ - global input_frame, parent_frame - parent_frame = root_in - - input_frame = Frame(root_in) - build_frame() - input_controller.initalize(database) - - return input_frame - -def build_frame(): - """Builds the primary frame, 3 columns only - """ - # frame config - input_frame.grid_columnconfigure(0, weight=1, uniform="equal") - input_frame.grid_columnconfigure(1, weight=1, uniform="equal") - input_frame.grid_columnconfigure(2, weight=1, uniform="equal") - input_frame.grid_propagate(False) - - frame_row = 1 - enter_service_and_id_row(frame_row) - - frame_row += 1 - view_add_id_row(frame_row) - - frame_row += 1 - delete_open_user_row(frame_row) - - frame_row += 1 - seperator_row(frame_row) - - frame_row += 1 - known_posts_row(frame_row) - - frame_row += 1 - unknown_posts_row(frame_row) - - frame_row += 1 - seperator_row(frame_row) - - frame_row += 1 - display_users(frame_row) - - -# functions to define the rows and the corresponding widgets -def enter_service_and_id_row(frame_row): - """Row that has the list box for services and input box for id - - Args: - frame_row (_type_): row number to exist on - """ - global selected_service_var, id_entry_element - operation_label = Label(input_frame, text="Enter service and user id:") - operation_label.grid(row=frame_row, column=0) - selected_service_var = StringVar(parent_frame) - selected_service_var.set(options[0]) - service_select_ele = OptionMenu( input_frame , selected_service_var , *options ) - service_select_ele.grid( row=frame_row, column=1, pady= 10, sticky= W + E) - service_select_ele.configure(width=10, height=2) - - id_entry_element = Entry(input_frame) - id_entry_element.insert(0,"71308758") - id_entry_element.grid(row=frame_row, column=2) - - input_controller.set_service_and_user_id_ele(selected_service_var, id_entry_element) - -def view_add_id_row(frame_row): - """Makes the add id to subscriptions button row - - Args: - frame_row (_type_): row number to exist on - """ - add_button = Button(input_frame, text = "Add id to subscriptions", command = input_controller.add_user) - add_button.grid( row = frame_row, column=1, pady= 10, sticky= W + E) - add_button.configure(width=10, height=2) - - user_operation_status_label = Label(input_frame, text="") - user_operation_status_label.grid(row=frame_row, column=2) - status_helper.set_user_operation_status_label(user_operation_status_label) - input_controller.set_add_button(add_button) - -def delete_open_user_row(frame_row): - """Adds a delete user and open user page button - - Args: - frame_row (_type_): row number to exist on - """ - delete_user_button = Button(input_frame, text = "Delete user", command = input_controller.delete_user, bg = "red") - delete_user_button.grid( row = frame_row, column=0, pady= 10, sticky= W + E) - delete_user_button.configure(width=10, height=2) - - open_user_button = Button(input_frame, text = "Open user page", command = input_controller.open_user_page) - open_user_button.grid( row = frame_row, column=2, pady= 10, sticky= W + E) - open_user_button.configure(width=10, height=2) - -def seperator_row(frame_row): - """Row to create the seperator line - - Args: - frame_row (_type_): row number to exist on - """ - seperator1 = ttk.Separator(input_frame, orient=HORIZONTAL) - seperator1.grid(row = frame_row, column=0, columnspan=3, sticky="ew", pady=10) - -def known_posts_row(frame_row): - """Creates a listbox for known posts and buttons to move known to unknown - - Args: - frame_row (_type_): row number to exist on - """ - known_posts_label = Label(input_frame, text="Known posts") - known_posts_label.grid(row=frame_row, column=0) - - known_posts_list_var = StringVar(value=[]) - known_posts_listbox = Listbox(input_frame, selectmode= "extended", \ - listvariable=known_posts_list_var) - known_posts_listbox.grid( row=frame_row, column=1, pady= 10, sticky= "nsew") - known_posts_listbox.configure(width=10, height=2) - input_frame.grid_rowconfigure(frame_row, minsize=200) - - move_from_known_to_unknown_button = Button(input_frame, \ - text = "Move known post to unknown", \ - command= input_controller.move_from_known_to_unknown) - move_from_known_to_unknown_button.grid( row= frame_row, column=2, pady= 10, sticky= W + E) - move_from_known_to_unknown_button.configure(width=10, height=2) - - input_controller.set_known_post_var_list(known_posts_list_var, known_posts_listbox) - -def unknown_posts_row(frame_row): - """Creates a listbox for unknown posts and buttons to move unknown to known - - Args: - frame_row (_type_): row number to exist on - """ - - unknown_post_labels = Label(input_frame, text="Unknown posts") - unknown_post_labels.grid(row=frame_row, column=0) - - unknown_posts_list_var = StringVar(value=[]) - unknown_posts_listbox = Listbox(input_frame, selectmode= "extended", \ - listvariable=unknown_posts_list_var) - unknown_posts_listbox.grid( row=frame_row, column=1, pady= 10, sticky= "nsew") - unknown_posts_listbox.configure(width=10, height=2) - input_frame.grid_rowconfigure(frame_row, minsize=200) - - move_from_unknown_to_known_button = Button(input_frame, \ - text = "Move unknown post to known", \ - command= input_controller.move_from_unknown_to_known) - move_from_unknown_to_known_button.grid( row= frame_row, column=2, pady= 10, sticky= W + E) - move_from_unknown_to_known_button.configure(width=10, height=2) - - input_controller.set_unknown_post_var_list(unknown_posts_list_var, unknown_posts_listbox) - - -def display_users(frame_row): - """Creates a listbox for known users and a button to open that user - - Args: - frame_row (_type_): row number to exist on - """ - unknown_post_labels = Label(input_frame, text="Known users") - unknown_post_labels.grid(row=frame_row, column=0) - - known_users_list_var = StringVar(value=[]) - known_users_listbox = Listbox(input_frame, selectmode= "single", \ - listvariable=known_users_list_var) - known_users_listbox.grid( row=frame_row, column=1, pady= 10, sticky= "nsew") - known_users_listbox.configure(width=10, height=1) - input_frame.grid_rowconfigure(frame_row, minsize=100) - - get_selected_user_button = Button(input_frame, text = "Get selected user", \ - command= input_controller.get_selected_users) - get_selected_user_button.grid( row= frame_row, column=2, pady= 10, sticky= W + E) - get_selected_user_button.configure(width=10, height=2) - - input_controller.set_display_users(known_users_list_var, known_users_listbox) diff --git a/input_panel/status_helper.py b/input_panel/status_helper.py deleted file mode 100644 index d2c2246..0000000 --- a/input_panel/status_helper.py +++ /dev/null @@ -1,63 +0,0 @@ -""" Contains all methods to modify the status labels""" -DEFAULT_BG_COLOR = "#f0f0f0" - -# pylint: disable=C0103 -user_operation_status_label = None -# pylint: enable=C0103 - -def set_user_operation_status_label(user_operation_status_label_in): - """Sets the status label to be modified by status_helper - - Args: - user_operation_status_label_in (_type_): status label to be used - """ - global user_operation_status_label - user_operation_status_label = user_operation_status_label_in - -def set_user_operation_status_values(label_text, bg_color="default"): - """Sets the values for the operation status label - - Args: - label_text (_type_): text to be displayed - bg_color (str, optional): color to be displayed. Defaults to "default". - """ - if bg_color == "default": - user_operation_status_label.config(text=label_text, bg = DEFAULT_BG_COLOR) - return - user_operation_status_label.config(text=label_text, bg = bg_color) - -def clear_user_operation_status(): - """Clears the user operation status label - """ - user_operation_status_label.config(text="", bg = DEFAULT_BG_COLOR) - -# pylint: disable=C0103 -get_updates_status_label = None -# pylint: enable=C0103 - -def set_get_updates_status_label(get_updates_status_label_in): - """Sets the update status label to be modified - - Args: - get_updates_status_label_in (_type_): update status label to be used - """ - global get_updates_status_label - get_updates_status_label = get_updates_status_label_in - - -def set_get_updates_status_label_values(label_text, bg_color="default"): - """Sets the values for the update status label - - Args: - label_text (_type_): text to be displayed - bg_color (str, optional): color to be displayed. Defaults to "default". - """ - if bg_color == "default": - get_updates_status_label.config(text=label_text, bg = DEFAULT_BG_COLOR) - return - get_updates_status_label.config(text=label_text, bg = bg_color) - -def clear_get_updates_status_label(): - """Clears the get update status label - """ - get_updates_status_label.config(text="", bg = DEFAULT_BG_COLOR) diff --git a/models/__init__.py b/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index b242886..0000000 Binary files a/models/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/models/__pycache__/databaseModel.cpython-310.pyc b/models/__pycache__/databaseModel.cpython-310.pyc deleted file mode 100644 index c84896b..0000000 Binary files a/models/__pycache__/databaseModel.cpython-310.pyc and /dev/null differ diff --git a/models/__pycache__/database_model.cpython-310.pyc b/models/__pycache__/database_model.cpython-310.pyc deleted file mode 100644 index 9e5cccf..0000000 Binary files a/models/__pycache__/database_model.cpython-310.pyc and /dev/null differ diff --git a/models/__pycache__/userModel.cpython-310.pyc b/models/__pycache__/userModel.cpython-310.pyc deleted file mode 100644 index 5abffaa..0000000 Binary files a/models/__pycache__/userModel.cpython-310.pyc and /dev/null differ diff --git a/models/__pycache__/user_model.cpython-310.pyc b/models/__pycache__/user_model.cpython-310.pyc deleted file mode 100644 index 0a2002c..0000000 Binary files a/models/__pycache__/user_model.cpython-310.pyc and /dev/null differ diff --git a/models/database_model.py b/models/database_model.py deleted file mode 100644 index eef5cfa..0000000 --- a/models/database_model.py +++ /dev/null @@ -1,333 +0,0 @@ -""" Defines a database that runs on a sqlite database. Tested through database tests. - Some hardcode can be found in the constants.""" -import urllib.request -import json -import logging -import sqlite3 -import threading -from typing import List - -from input_panel import status_helper -import constants - -from . import user_model - -cursorList = [] -connectionList = [] - -class Database(): - """ Model of a database backed by a sqlite database""" - def __init__(self): - logging.info("Creating new database object") - # gathering cursors and connections to be closed later on - self.thread_data = threading.local() - - _, cursor = self.get_connection_and_cursor() - cursor.execute(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{constants.USERS_TABLE_NAME}'") - existing_table = cursor.fetchone() - - if existing_table is None: - cursor.execute(constants.USER_TABLE_QUERY) - logging.info("Creating new table") - else: - logging.info("Found table") - - def get_connection_and_cursor(self)-> (sqlite3.Connection, sqlite3.Cursor): - """Checks if the thread_data has a connection yet. Aka if this thread has a connection. - If not, opens a connection. Attempts to ensure a single connection per thread - - Returns: - sqlite.Connection: Connection object of thread connection - sqlite.Cursor: Cursor obj of thread connection - """ - if not hasattr(self.thread_data, "connection") or self.thread_data.connection is None: - self.thread_data.connection = sqlite3.connect(constants.DATABASE_FILENAME) - connectionList.append(self.thread_data.connection) - self.thread_data.cursor = self.thread_data.connection.cursor() - cursorList.append(self.thread_data.cursor) - return self.thread_data.connection, self.thread_data.cursor - - def close_thread_connections(self): - """Close all thread database connections - """ - if hasattr(self.thread_data, "cursor"): - cursorList.remove(self.thread_data.cursor) - self.thread_data.cursor.close() - self.thread_data.cursor = None - if hasattr(self.thread_data, "connection"): - connectionList.remove(self.thread_data.connection) - self.thread_data.connection.close() - self.thread_data.connection = None - - def create_user(self, user_id: int, service: str, add_button, *staticCallbacks): - """Creates a user in the database, user data should closely follow user_obj - - Args: - user_id (int): user_id on kemono of the user - service (str): Service for the user_id - add_button (Button): button to be enabled/disabled while this runs - """ - if not isinstance(user_id, int) and user_id.isdigit(): - user_id = int(user_id) - elif not isinstance(user_id, int): - raise ValueError("id couldnt be made into an int") - assert service in constants.SERVICES, "service must be part of the defined services and capitalized properly" - thread_connection, thread_cursor = self.get_connection_and_cursor() - try: - # get ids - status_helper.set_user_operation_status_values("Got 0 user posts", "orange") - - request = "https://kemono.party/api/" + service.lower() + "/user/" + str(user_id) + "?o=" - i = 0 - known_id_list = [] - status_helper.set_user_operation_status_values("Looking for posts", "orange") - with urllib.request.urlopen(request + str(i)) as contents: - response = json.loads(contents.read().decode()) - while bool(response): #keep running while contents exists - status_helper.set_user_operation_status_values("Got " +str(i)+" user posts and looking more", "orange") - for obj in response: - known_id_list.append(int(obj["id"])) - - i += 50 - with urllib.request.urlopen(request + str(i)) as contents: - response = json.loads(contents.read().decode()) - - status_helper.set_user_operation_status_values("Finished getting all posts", "orange") - - # actually write the new user and put it into the database - known_id_list_json = json.dumps(known_id_list) - unknown_id_list_json = json.dumps([]) - insert_query = f"INSERT INTO {constants.USERS_TABLE_NAME} VALUES (?, ?, ?, ?, ?, ?)" - data_to_insert = (None, "na", user_id, service, known_id_list_json, unknown_id_list_json) - thread_cursor.execute(insert_query, data_to_insert) - status_helper.set_user_operation_status_values("User is now in database, reclick to view", "green") - add_button["state"] = "normal" - thread_connection.commit() - - for callback in staticCallbacks: - callback() - except Exception as error: - logging.error("Failed to add a user: %s", {error}) - thread_connection.rollback() - finally: - self.close_thread_connections() - - def update_database_row_user_object(self, neew_user_obj:user_model.User): - """Updates a database row using a user object's info - - Args: - user_obj (user_model.User): User obj to insert - """ - old_user_obj = self.get_user_from_database_id(neew_user_obj.database_id) - assert old_user_obj is not None, "Couldnt find a user with that id and service" - - logging.info("Updating user: %s", old_user_obj) - connection, cursor = self.get_connection_and_cursor() - row_tuple = neew_user_obj.get_as_row_tuple() - database_id = row_tuple[0] - - set_clause = ", ".join(f"{column} = ?" for column in constants.USER_TABLE_COL_NAMES[1:]) - update_query = f"UPDATE {constants.USERS_TABLE_NAME} \ - SET {set_clause} \ - WHERE {constants.USER_TABLE_COL_NAMES[0]} = ?" - values = row_tuple[1:] + (database_id,) - - cursor.execute(update_query, values) - connection.commit() - - def update_database_row_manual_input(self, user_id: int, service: str, known_ids: List[int], unknown_ids:List[int]): - """Alternative way to update the database in the case we only have user id and service - - Args: - user_id (int): _description_ - service (str): _description_ - known_ids (List[int]): _description_ - unknown_ids (List[int]): _description_ - - Raises: - ValueError: _description_ - """ - user_obj = self.get_user_obj(user_id,service) - assert user_obj is not None, "Couldnt find a user with that id and service" - if user_obj is None: - raise ValueError("Couldnt find a user object") - user_obj.checked_post_ids = known_ids - user_obj.unchecked_post_ids = unknown_ids - self.update_database_row_user_object(user_obj) - - def delete_user(self, user_id: int, service: str, *staticCallbacks): - """Deletes a user with minimal info - - Args: - user_id (int): id of user - service (str): service of user - """ - connection, cursor = self.get_connection_and_cursor() - if not self.does_user_exist(user_id, service): - logging.error("Trying to delete an invalid user") - - try: - delete_query = f"DELETE FROM {constants.USERS_TABLE_NAME} \ - WHERE {constants.USER_TABLE_COL_NAMES[2]} = ? \ - AND {constants.USER_TABLE_COL_NAMES[3]} = ?" - cursor.execute(delete_query, (user_id, service)) - connection.commit() - status_helper.set_user_operation_status_values("Deleted user", "green") - - for callback in staticCallbacks: - callback() - except Exception as error: - logging.error("Failed to delete a user: %s", error) - status_helper.set_user_operation_status_values("Failed to delete user", "red") - connection.rollback() - finally: - self.close_thread_connections() - - # various gets - def get_all_uknown_post_ids_and_service(self)-> list[str]: - """Gets all unknown post, ids, and services from the entirety of the database and services - (in the case two post ids can be the same id but different service) - - Returns: - list[str]: is a list of strings where the string is in the format "post id, service, id" - """ - _, cursor = self.get_connection_and_cursor() - - select_query = f"\ - SELECT {constants.USER_TABLE_COL_NAMES[5]},{constants.USER_TABLE_COL_NAMES[3]},{constants.USER_TABLE_COL_NAMES[2]} \ - FROM {constants.USERS_TABLE_NAME}" - cursor.execute(select_query) - rows = cursor.fetchall() - - unknown_posts = [] - for row in rows: - for post_id in json.loads(row[0]): - unknown_posts.append(f"{post_id},{row[1]},{row[2]}") - - return unknown_posts - - def does_user_exist(self, user_id: int, service: str)-> bool: - """checks for user - - Args: - user_id (int): user id - service (str): user service - - Returns: - bool: if exist or not - """ - return bool(self.get_user_obj(user_id, service)) - - def get_user_obj(self, user_id: int, service: str)->user_model.User: - """gets the user object from id + service - - Args: - user_id (int): user id - service (str): user service - - Returns: - user_model.User: user object - """ - _, cursor = self.get_connection_and_cursor() - - try: - user_id = int(user_id) - except ValueError: - logging.error("Couldnt convert input id into int") - return None - if service not in constants.SERVICES: - logging.error("Service input wasnt recognized") - return None - - select_query = f"SELECT * FROM {constants.USERS_TABLE_NAME} \ - WHERE {constants.USER_TABLE_COL_NAMES[2]} = ? AND {constants.USER_TABLE_COL_NAMES[3]} = ?" - cursor.execute(select_query, (user_id, service)) - - row = cursor.fetchone() - # maybe more efficent way of checking if user exist - if row is None: - return None - - return user_model.convert_row_to_user(row) - - def get_user_from_database_id(self, database_id:int)-> user_model.User: - """ Uses the id in particular since the id is an unshakeable reference - - Args: - database_id (int): generated uniquely per database, no two userObj can have same databsae id - - Returns: - user_model.User: the row as a user - """ - _, cursor = self.get_connection_and_cursor() - - select_query = f"SELECT * FROM {constants.USERS_TABLE_NAME} \ - WHERE {constants.USER_TABLE_COL_NAMES[0]} = ? " - cursor.execute(select_query, (str(database_id),)) - - row = cursor.fetchone() - # maybe more efficent way of checking if user exist - if row is None: - return None - - return user_model.convert_row_to_user(row) - - def get_all_user_obj(self)->List[user_model.User]: - """Gets all users in the form of a user model - - Returns: - List[user_model.User]: contains all user objects registered - """ - _, cursor = self.get_connection_and_cursor() - select_query = f"SELECT * FROM {constants.USERS_TABLE_NAME}" - cursor.execute(select_query) - - # Fetch all rows from the result - rows = cursor.fetchall() - - users = [] - for row in rows: - users.append(user_model.convert_row_to_user(row)) - - return users - - def get_all_user_id_and_services(self)->list[tuple]: - """Specifically gets every user's id and corresponding service - - Returns: - list[tuple]: per tuple, ele 0 is id, ele 1 is website - """ - _, cursor = self.get_connection_and_cursor() - - select_query = f"SELECT {constants.USER_TABLE_COL_NAMES[2]}, \ - {constants.USER_TABLE_COL_NAMES[3]} FROM {constants.USERS_TABLE_NAME}" - cursor.execute(select_query) - rows = cursor.fetchall() - - return rows - - # various functions - def know_unknown_post(self, user_id: int, service :str, post_id: int): - """ Turns a unknown post into known, does not go other way around since input panel handles that - - Args: - user_id (int): id - service (str): service - post_id (int): post id - """ - user_obj = self.get_user_obj(user_id, service) - if user_obj is None: - raise KeyError("User id couldnt find anyone with that id") - if post_id not in user_obj.unchecked_post_ids: - raise KeyError("The post id isnt part of unchecked posts") - if post_id in user_obj.checked_post_ids: # already done - return - user_obj.checked_post_ids.append(post_id) - user_obj.unchecked_post_ids.remove(post_id) - self.update_database_row_user_object(user_obj) - - def close_all_connections(self): - """Shuts down all possible connections in known threads - """ - for connection in connectionList: - connection.close() diff --git a/models/user_model.py b/models/user_model.py deleted file mode 100644 index d0abe40..0000000 --- a/models/user_model.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Stores data about a user, all their posts and such""" -import json -from typing import List - -class User(): - """A user object has some basic information about itself and it's database id - """ - def __init__(self, - database_id: int, - name: str, - user_id: int, - service: str, - checked_post_ids: List[int]=None, - unchecked_post_ids: List[int]=None - ): - self.database_id = database_id - self.name = name - self.id = user_id - self.service = service - self.checked_post_ids = checked_post_ids - self.unchecked_post_ids = unchecked_post_ids - - def __str__(self): - return f"User {self.id} of service {self.service}" - - def __repr__(self): - return f"User {self.id} of service {self.service}" - - def get_as_row_tuple(self)-> tuple: - """Formats a user as a tuple to be used for easy import to database - Returns: - tuple: is a tuple of the user's info, note post ids become a string - """ - return (self.database_id, - self.name, - self.id, - self.service, - json.dumps(self.checked_post_ids), - json.dumps(self.unchecked_post_ids)) - -def convert_row_to_user(row_tuple:tuple)-> User: - """Converts a database row into a user object - - Args: - row_tuple (_type_): Tuple from the database - - Returns: - _User: user object built from the tuple - """ - database_id = row_tuple[0] - name = row_tuple[1] - user_id = row_tuple[2] - service = row_tuple[3] - checked_post_ids = json.loads(row_tuple[4]) - unchecked_post_ids = json.loads(row_tuple[5]) - return User(database_id, name, user_id, service, checked_post_ids, unchecked_post_ids) diff --git a/output_panel/__init__.py b/output_panel/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/output_panel/__pycache__/__init__.cpython-310.pyc b/output_panel/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 4092abb..0000000 Binary files a/output_panel/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/output_panel/__pycache__/kemonoHelper.cpython-310.pyc b/output_panel/__pycache__/kemonoHelper.cpython-310.pyc deleted file mode 100644 index 0fde154..0000000 Binary files a/output_panel/__pycache__/kemonoHelper.cpython-310.pyc and /dev/null differ diff --git a/output_panel/__pycache__/outputController.cpython-310.pyc b/output_panel/__pycache__/outputController.cpython-310.pyc deleted file mode 100644 index d0ca11b..0000000 Binary files a/output_panel/__pycache__/outputController.cpython-310.pyc and /dev/null differ diff --git a/output_panel/__pycache__/outputFrameHelper.cpython-310.pyc b/output_panel/__pycache__/outputFrameHelper.cpython-310.pyc deleted file mode 100644 index 2fa8f22..0000000 Binary files a/output_panel/__pycache__/outputFrameHelper.cpython-310.pyc and /dev/null differ diff --git a/output_panel/__pycache__/outputView.cpython-310.pyc b/output_panel/__pycache__/outputView.cpython-310.pyc deleted file mode 100644 index c64d1d9..0000000 Binary files a/output_panel/__pycache__/outputView.cpython-310.pyc and /dev/null differ diff --git a/output_panel/__pycache__/output_controller.cpython-310.pyc b/output_panel/__pycache__/output_controller.cpython-310.pyc deleted file mode 100644 index 6908770..0000000 Binary files a/output_panel/__pycache__/output_controller.cpython-310.pyc and /dev/null differ diff --git a/output_panel/__pycache__/output_view.cpython-310.pyc b/output_panel/__pycache__/output_view.cpython-310.pyc deleted file mode 100644 index f3c51e9..0000000 Binary files a/output_panel/__pycache__/output_view.cpython-310.pyc and /dev/null differ diff --git a/output_panel/output_controller.py b/output_panel/output_controller.py deleted file mode 100644 index 9a1d959..0000000 --- a/output_panel/output_controller.py +++ /dev/null @@ -1,116 +0,0 @@ -"Controller/busniess logic of the output view/right panel of the application" -import threading -import urllib.request -import json -from tkinter import StringVar, Button -import string - -from models.database_model import Database -from input_panel import status_helper - -# pylint: disable=C0103 -new_posts_list_var = None -update_posts_button = None -database = None -# pylint: enable=C0103 - - -def pass_vars(new_posts_list_var_in : StringVar, - update_posts_button_in : Button, - database_in : Database): - """Sets variables from the output view to be used by the controller - - Args: - new_posts_list_var_in (StringVar): needed to get selected new posts - update_posts_button_in (Button): needed so we can enable and disable button as desired - database_in (Database): need database to operate on - """ - global new_posts_list_var, update_posts_button, database - new_posts_list_var = new_posts_list_var_in - update_posts_button = update_posts_button_in - database = database_in - -# define a function to get api post ids -def get_unseen_post_ids_from_page(request: string, - known_ids: list[int], - unknown_ids: list[int], - known_unseen_ids: list[int]) -> list[int]: - """Get new posts that we do not yet know about - - Args: - request (int): api request string - known_ids(list[int]): in database and user has seen - unknown_ids(list[int]): these ids already exist in the database but are simply marked as unseen by user - known_unseen_ids (list[int]): known posts we didnt know about previously, avoid adding again - - Returns: - list[str]: all new unseen posts to be added to database - """ - with urllib.request.urlopen(request) as contents: - data = contents.read() - response = json.loads(data.decode()) - - if response==[]: - return [] - - api_post_ids = [] - for obj in response: - api_post_ids.append(int(obj["id"])) - - new_unseen_posts = [] - for post_id in api_post_ids: - if(post_id not in known_ids - and post_id not in unknown_ids - and post_id not in known_unseen_ids): - new_unseen_posts.append(post_id) - return new_unseen_posts - -def get_unread_posts(): - """Puts the threading logic in the controller - """ - threading.Thread(target=get_unread_posts_thread).start() -def get_unread_posts_thread(): - """ Will attempt to get all unread/unknown posts. - First, checking the database of already known/unknown posts. - Then will try to make api calls to find any new unread posts - """ - - update_posts_button.config(state="disabled") - unknown_posts = database.get_all_uknown_post_ids_and_service() - new_posts_list_var.set(unknown_posts) - status_helper.set_get_updates_status_label_values("Got database unknown posts!", "orange") - - ## Fetch api, compare posts to find new posts, if neeeded update new_posts_list_var - update_posts_button.config(state="normal") - - users = database.get_all_user_obj() - for user in users: - service = user.service - user_id = user.id - status_helper.set_get_updates_status_label_values( - "Getting posts from "+service+" for id:"+str(user_id), "orange") - - api_index=0 - request = "https://kemono.party/api/" + service + \ - "/user/" + str(user_id) + "?o=" - id_list = [] - unseen_ids = [] - known_ids = user.checked_post_ids - unknown_ids = user.unchecked_post_ids - - id_list += get_unseen_post_ids_from_page(request+str(api_index), known_ids, unknown_ids, unseen_ids) - unseen_ids += id_list - # if we found some unseen posts, check all pages until we no longer find unseen posts - if len(id_list) != 0: - while len(id_list) != 0: #keep running while api responses exists - api_index += 50 - id_list= get_unseen_post_ids_from_page(request+str(api_index), known_ids, unknown_ids, unseen_ids) - unseen_ids += id_list - new_unknown = unknown_ids+unseen_ids - new_unknown.sort() - - database.update_database_row_manual_input(user_id, service, known_ids, new_unknown) - - unknown_posts = database.get_all_uknown_post_ids_and_service() - new_posts_list_var.set(unknown_posts) - status_helper.set_get_updates_status_label_values("Finished getting posts from web", "green") diff --git a/output_panel/output_view.py b/output_panel/output_view.py deleted file mode 100644 index 9eb1bc6..0000000 --- a/output_panel/output_view.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Contains all the frontend elements to be displayed to the user""" -from tkinter import StringVar, Listbox, Button, Label, W, E, Frame -import webbrowser - -from input_panel import status_helper -from . import output_controller - -# frame information -# pylint: disable=C0103 -root = None -output_frame = None -list_known_posts = None -new_posts_list_var = None -database = None -# pylint: enable=C0103 - -def build_frame(): - """ Primary frame for the output view as a whole. - The output view is where users can see the output of checks for unseen new links and unchecked links - - Returns: - _type_: _description_ - """ - global list_known_posts, new_posts_list_var - - # limit to 3 columns - output_frame.grid_columnconfigure(0, weight=1, uniform="equal") - output_frame.grid_columnconfigure(1, weight=1, uniform="equal") - output_frame.grid_columnconfigure(2, weight=1, uniform="equal") - - frame_row = 1 - update_posts_button = Button(output_frame, - text = "Update unread posts", command = output_controller.get_unread_posts) - update_posts_button.grid( row = frame_row, column=1, pady= 10, sticky= W + E) - - get_update_status = Label(output_frame, text="No updates gotten", bg = "Grey", wraplength=100) - get_update_status.grid(row=frame_row, column=0) - status_helper.set_get_updates_status_label(get_update_status) - - frame_row += 1 - new_posts_list_var = StringVar(value=[]) - list_known_posts = Listbox(output_frame, selectmode= "extended", listvariable=new_posts_list_var) - list_known_posts.grid( row=frame_row, column=1, pady= 10, sticky= "nsew") - list_known_posts.configure(width=10, height=2) - output_frame.grid_rowconfigure(frame_row, minsize=200) - - frame_row += 1 - open_selected_button = Button(output_frame, text = "Open selected posts", command = open_selected_ids) - open_selected_button.grid( row = frame_row, column=0, pady= 10, sticky= W + E) - - finish_posts_button = Button(output_frame, text = "Finish selected posts", command = know_unknown_post) - finish_posts_button.grid( row = frame_row, column=2, pady= 10, sticky= W + E) - - return new_posts_list_var, update_posts_button - - - -def initalize_output_frame(root_in, database_in): - """Called to setup the view by the main application - - Args: - root_in (_type_): root frame by the main application - database_in (_type_): main database by the main application - - Returns: - _type_: returns the frame created for this output view - """ - global root,output_frame, database, new_posts_list_var - root = root_in - database = database_in - - output_frame = Frame(root, bg="grey") - output_frame.grid_propagate(False) - - new_posts_list_var, update_posts_button = build_frame() - output_controller.pass_vars(new_posts_list_var, update_posts_button, database) - - return output_frame - -## maybe move to controller but might require more variable passing -def open_selected_ids(): - """Minor function to open selected posts""" - for selection in list_known_posts.curselection(): - post_id, service, user_id = list_known_posts.get(selection).split(",") - webbrowser.open("https://kemono.party/"+service.lower()+"/user/"+user_id+"/post/"+post_id) - -def know_unknown_post(): - """Minor function to know an unknown post""" - for selection in list_known_posts.curselection(): - post_id, service, user_id = list_known_posts.get(selection).split(",") - database.know_unknown_post(user_id, service, post_id) - - offset = 0 - for selection in list_known_posts.curselection(): - list_known_posts.delete(selection-offset) - offset += 1 - \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index ed9f9cc..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -coverage \ No newline at end of file diff --git a/testing/.coverage b/testing/.coverage deleted file mode 100644 index 8f08c70..0000000 Binary files a/testing/.coverage and /dev/null differ diff --git a/testing/__init__.py b/testing/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/testing/__pycache__/__init__.cpython-310.pyc b/testing/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 8948438..0000000 Binary files a/testing/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/databaseTest.cpython-310.pyc b/testing/__pycache__/databaseTest.cpython-310.pyc deleted file mode 100644 index 5b0e070..0000000 Binary files a/testing/__pycache__/databaseTest.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/database_test.cpython-310.pyc b/testing/__pycache__/database_test.cpython-310.pyc deleted file mode 100644 index 0ae2575..0000000 Binary files a/testing/__pycache__/database_test.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/local_constants.cpython-310.pyc b/testing/__pycache__/local_constants.cpython-310.pyc deleted file mode 100644 index 39e6221..0000000 Binary files a/testing/__pycache__/local_constants.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/output_controller_test.cpython-310.pyc b/testing/__pycache__/output_controller_test.cpython-310.pyc deleted file mode 100644 index dab05cf..0000000 Binary files a/testing/__pycache__/output_controller_test.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/testConstants.cpython-310.pyc b/testing/__pycache__/testConstants.cpython-310.pyc deleted file mode 100644 index 8018c4b..0000000 Binary files a/testing/__pycache__/testConstants.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/testConstants.cpython-311.pyc b/testing/__pycache__/testConstants.cpython-311.pyc deleted file mode 100644 index 7e1a565..0000000 Binary files a/testing/__pycache__/testConstants.cpython-311.pyc and /dev/null differ diff --git a/testing/__pycache__/test_constants.cpython-310.pyc b/testing/__pycache__/test_constants.cpython-310.pyc deleted file mode 100644 index 0cf1498..0000000 Binary files a/testing/__pycache__/test_constants.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/test_database.cpython-310.pyc b/testing/__pycache__/test_database.cpython-310.pyc deleted file mode 100644 index 8f94320..0000000 Binary files a/testing/__pycache__/test_database.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/test_output_controller.cpython-310.pyc b/testing/__pycache__/test_output_controller.cpython-310.pyc deleted file mode 100644 index 6b0a928..0000000 Binary files a/testing/__pycache__/test_output_controller.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/test_user.cpython-310.pyc b/testing/__pycache__/test_user.cpython-310.pyc deleted file mode 100644 index f6b9ec2..0000000 Binary files a/testing/__pycache__/test_user.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/userTest.cpython-310.pyc b/testing/__pycache__/userTest.cpython-310.pyc deleted file mode 100644 index 6430a55..0000000 Binary files a/testing/__pycache__/userTest.cpython-310.pyc and /dev/null differ diff --git a/testing/__pycache__/user_test.cpython-310.pyc b/testing/__pycache__/user_test.cpython-310.pyc deleted file mode 100644 index 78ac864..0000000 Binary files a/testing/__pycache__/user_test.cpython-310.pyc and /dev/null differ diff --git a/testing/liliuhms_post_api_page_one.bin b/testing/liliuhms_post_api_page_one.bin deleted file mode 100644 index 0988ba2..0000000 --- a/testing/liliuhms_post_api_page_one.bin +++ /dev/null @@ -1,210 +0,0 @@ -[ - { - "added": "Tue, 23 Mar 2021 03:12:03 GMT", - "attachments": [], - "content": "

Hello everyone!!! (happy halloweeeeen!)

So actually, I was thinking about it and I feel bad if you get charged tomorrow, November 1st, while my shop is open!!

I know many of you are planning to purchase something from me, which I so appreciate! Therefore I have decided to pause the November payment. Especially with holiday shopping coming up, I would rather you use your expenses towards that this month!

This being said, that means all of my digital content for November will come to you FREE OF CHARGE! It's my gift to you! Thank you for your support these last few months, and especially your patience! I will let you know when I will be resuming payments again!

Cheers!

", - "edited": "Sat, 31 Oct 2020 18:07:22 GMT", - "embed": {}, - "file": {}, - "id": "43376039", - "published": "Sat, 31 Oct 2020 18:07:22 GMT", - "service": "patreon", - "shared_file": false, - "title": "NOVEMBER BILLING PAUSED", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:27:16 GMT", - "attachments": [ - { - "name": "halloween-1.png", - "path": "/44/ab/44ab1e45433ecf74f904d5e5a95dc33e144a22a511692a3cd0cadec0988490f9.png" - }, - { - "name": "halloween-3.png", - "path": "/94/04/9404faf7b1f292d7ac70f28d9662cad0dd594638c0ee5360871e3052bbda0268.png" - }, - { - "name": "halloween-2.png", - "path": "/28/f8/28f800dedf7d661677350b06432270b79deaac3480f3f7981d2cc52bfe9d128b.png" - }, - { - "name": "halloween-4.png", - "path": "/04/a4/04a4d0b371469ea263bdc9c85ebc21156fd183d8646ce3c1287c9941b07b62ad.png" - }, - { - "name": "Screenshot_2020-10-01_161603.png", - "path": "/a9/5d/a95dbbd84235acc361cce23ea22357be4ccdff68ed10ea5f467bd113f7da8204.png" - } - ], - "content": "

this is a freebie for everybunny!

you can download all of them below!

enjoy!

", - "edited": "Thu, 01 Oct 2020 22:21:05 GMT", - "embed": {}, - "file": { - "name": "Screenshot 2020-10-01 161603.png", - "path": "/a9/5d/a95dbbd84235acc361cce23ea22357be4ccdff68ed10ea5f467bd113f7da8204.png" - }, - "id": "42261909", - "published": "Thu, 01 Oct 2020 22:21:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "free to use october icons!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:36:44 GMT", - "attachments": [ - { - "name": "IMG_6707.jpg", - "path": "/a3/f1/a3f1cc650cc6151281875c7b328de452141bcbe82bea3c3c119b397b99f4cd65.jpg" - }, - { - "name": "IMG_6714.jpg", - "path": "/84/51/84510edf95d1d727a5ecce7e3b84eae315c70a3f868076e50fed3fba51ea8404.jpg" - } - ], - "content": "

AAAH FINALLY!! After some mishaps, the August patreon pins have arrived!!!!


I will be shipping these out this week, and I\u2019ll also upload the exclusive stationery each parcel is sent with afterwards!!!


Also, here\u2019s a peek at September\u2019s pin!! Many of you already guessed it\u2019s from Holland! \ud83c\udf37

", - "edited": "Tue, 08 Sep 2020 18:46:20 GMT", - "embed": {}, - "file": { - "name": "IMG_6707.jpg", - "path": "/a3/f1/a3f1cc650cc6151281875c7b328de452141bcbe82bea3c3c119b397b99f4cd65.jpg" - }, - "id": "41388689", - "published": "Tue, 08 Sep 2020 18:46:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "august pins shipping this week!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:39:55 GMT", - "attachments": [ - { - "name": "IMG_6235.jpg", - "path": "/37/5e/375e616b095891ecb24f52580a8af5f726d1f6a728e4d679a18b5041dedab7a2.jpg" - } - ], - "content": "

hello everyone!!!

FINALLY my postcard tier items came!!! they look so cute!! There were a few sticker malfunctions on the free launch sticker sheet but hopefully I can get things figured out \ud83d\ude2d

Pin pal enamel pins should be here this week as well! I am gradually packing everything and hope to have all the August physical tier stuff out by next week!! Thank you SO much for your patience!


September pins will ship MUCH earlier than this one because I ordered it in advance this time!!! Yahoo!

", - "edited": "Tue, 01 Sep 2020 17:00:41 GMT", - "embed": {}, - "file": { - "name": "IMG_6235.jpg", - "path": "/37/5e/375e616b095891ecb24f52580a8af5f726d1f6a728e4d679a18b5041dedab7a2.jpg" - }, - "id": "41084915", - "published": "Mon, 31 Aug 2020 23:24:35 GMT", - "service": "patreon", - "shared_file": false, - "title": "august postcard + sticker!!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:42:19 GMT", - "attachments": [ - { - "name": "IMG_5816.jpg", - "path": "/ba/6a/ba6a868daeb48d8e3a0db0ff283f58718c63b872b4c42a16f09202870e38430b.jpg" - } - ], - "content": "

hello my friends!!!!!

August pin pal club pins are finally finished!!!

(If you pledged at the end of July when Patreon launched, or before the end of this month, you will get this!)

Here\u2019s a photo from my manufacturer!!!

I\u2019ll be shipping out parcels through last week of August & beginning of September!

If you have any address changes please send me a message!

Also, please give some time for packages to arrive, as USPS is in a really difficult spot right now.

Thanks so much for all your support this month!


Reminder that if you were a $15+ pledge during the launch week in July you\u2019ll also receive a sticker sheet.

(Also, can you spy the September pin in the back? I wonder what country it could be from?)

", - "edited": "Mon, 24 Aug 2020 18:53:12 GMT", - "embed": {}, - "file": { - "name": "IMG_5816.jpg", - "path": "/ba/6a/ba6a868daeb48d8e3a0db0ff283f58718c63b872b4c42a16f09202870e38430b.jpg" - }, - "id": "40801379", - "published": "Mon, 24 Aug 2020 13:35:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "august pin pals!!!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:49:42 GMT", - "attachments": [ - { - "name": "august_patreon.png", - "path": "/34/24/34249db5b089d7a0f5bbe1006e600aaea40f5405bde6c967066892a2f98cfb8c.png" - } - ], - "content": "

HEEHOOOOOOOO!!!!

Hello again my friends from across the globe!

Here is the August postcard + sticker design for all tiers that are Super Trooper and up ($35+)

I'm probably going to have the monthly postcard tiers screenprinted locally with a print shop I love here!!! (so when you support my small business.... you're also supporting THEIR SMALL BUSINESS!!!!! small business ception...)

Also, I want to test out nice paper... this should be on French Press' speckletone white.. sexy paper...

I will also upload the high-res files for both of these in a separate private post so that you can print as many as you'd like for personal use.


Anywhooo!

Anyone who is in the Super Trooper tiers or higher before end of this month can get this exclusive postcard + sticker! (All physical tiers will ship near the end of the month or beginning of Sept. depending on when you pledged.)

", - "edited": "Tue, 04 Aug 2020 04:08:15 GMT", - "embed": {}, - "file": { - "name": "august_patreon.png", - "path": "/34/24/34249db5b089d7a0f5bbe1006e600aaea40f5405bde6c967066892a2f98cfb8c.png" - }, - "id": "40072994", - "published": "Tue, 04 Aug 2020 04:08:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "August Postcard + Sticker ($35+ tiers)", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:53:35 GMT", - "attachments": [], - "content": "

EDIT: Since everyone will be charged for the moment they first join I will be using those funds for August rewards, and pausing the August 1st charge.

-----

hello friends!
thank you SO much for checking out my patreon page, and for your support!!

because I am launching this patreon near the end of July, there will be a charge for when you first join.

i want to give all physical reward tiers who join before August 1st a bonus sticker sheet for this month!

all rewards will be shipped near the end of august to give me time to produce them.

oh! and here is the pin design for the month of August! the country bun visits this month is Venezuela! I wonder what he learns and sees there? I guess we'll have to wait for his letter.

again, thank you SO much for all the love and support! i hope this will be a fun thing for everyone!! during this pandemic it's been difficult to see people or travel, so I want these monthly letters & souvenirs from bun to feel like a warm hug from a friend!

", - "edited": "Fri, 24 Jul 2020 23:15:59 GMT", - "embed": {}, - "file": {}, - "id": "39678704", - "published": "Fri, 24 Jul 2020 20:50:54 GMT", - "service": "patreon", - "shared_file": false, - "title": "welcome patrons!!! (first week patron bonus + august design)", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 04:08:49 GMT", - "attachments": [ - { - "name": "Screen_Shot_2020-05-19_at_2.51.02_PM.png", - "path": "/de/5c/de5c8bed98e3ecdf659f5b3162cec369240cd187c816cfb60d518f4c6fe03e55.png" - }, - { - "name": "Untitled_Artwork_(2).png", - "path": "/a0/9f/a09f6e7cdd224b59d44f0b8b88b1d8319fa0895aec6ec6e161eac437d819e0de.png" - }, - { - "name": "van_duck_bg.jpg", - "path": "/4a/a0/4aa0021a217a4d9377a52e2aa0c2393e9466c9441396c851866d92fdc03cfc7a.jpg" - }, - { - "name": "image0.jpeg", - "path": "/58/05/5805878b7bc5e217d1c6cebe47e575eafa5d087736e1c10d9de9dc521db096f6.jpg" - }, - { - "name": "image1.png", - "path": "/e3/8c/e38cfceec967aeb155d84f9050cd2aa5bfe141096009d6ef10dab1cd9c7bf454.png" - }, - { - "name": "cart_MASTER.png", - "path": "/6f/69/6f69b18d3cb9c53f5305602242bd50896abbdee4a28f39940eb9745a49f3814c.png" - }, - { - "name": "shelf_MASTER.png", - "path": "/54/9b/549b1e4cadf22f20cfb7c5406eb2a76faa8b1a84b5cc553838e145816420a5a2.png" - }, - { - "name": "building_side_MASTER.png", - "path": "/e1/23/e1236d75356fb9b857f52b17711445cba7d3cc3e952a0218bc1ee22ea9f9c3ef.png" - } - ], - "content": "

hello patrons and perusers!!! \u00a0

this post is meant to give you an idea of the kind of behind-the-scenes stuff you'll see if you subscribe to one of my tiers!\u00a0

I have been working on a lot of branding and toy design lately for some of my characters in \"Jiji\" and am hoping to launch a kickstarter soon for a toy line! Here's some of the process work and spitballing of ideas I had for it!

Expect to see more work and images like this in paid tiers. A lot of these concepts and artworks won't be posted anywhere else!

", - "edited": "Tue, 19 May 2020 20:51:59 GMT", - "embed": {}, - "file": { - "name": "Untitled_Artwork (2).png", - "path": "/de/5c/de5c8bed98e3ecdf659f5b3162cec369240cd187c816cfb60d518f4c6fe03e55.png" - }, - "id": "37306299", - "published": "Tue, 19 May 2020 20:51:59 GMT", - "service": "patreon", - "shared_file": false, - "title": "first post! (public freebie)", - "user": "9210140" - } -] diff --git a/testing/liliuhms_post_api_page_one.json b/testing/liliuhms_post_api_page_one.json deleted file mode 100644 index 0988ba2..0000000 --- a/testing/liliuhms_post_api_page_one.json +++ /dev/null @@ -1,210 +0,0 @@ -[ - { - "added": "Tue, 23 Mar 2021 03:12:03 GMT", - "attachments": [], - "content": "

Hello everyone!!! (happy halloweeeeen!)

So actually, I was thinking about it and I feel bad if you get charged tomorrow, November 1st, while my shop is open!!

I know many of you are planning to purchase something from me, which I so appreciate! Therefore I have decided to pause the November payment. Especially with holiday shopping coming up, I would rather you use your expenses towards that this month!

This being said, that means all of my digital content for November will come to you FREE OF CHARGE! It's my gift to you! Thank you for your support these last few months, and especially your patience! I will let you know when I will be resuming payments again!

Cheers!

", - "edited": "Sat, 31 Oct 2020 18:07:22 GMT", - "embed": {}, - "file": {}, - "id": "43376039", - "published": "Sat, 31 Oct 2020 18:07:22 GMT", - "service": "patreon", - "shared_file": false, - "title": "NOVEMBER BILLING PAUSED", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:27:16 GMT", - "attachments": [ - { - "name": "halloween-1.png", - "path": "/44/ab/44ab1e45433ecf74f904d5e5a95dc33e144a22a511692a3cd0cadec0988490f9.png" - }, - { - "name": "halloween-3.png", - "path": "/94/04/9404faf7b1f292d7ac70f28d9662cad0dd594638c0ee5360871e3052bbda0268.png" - }, - { - "name": "halloween-2.png", - "path": "/28/f8/28f800dedf7d661677350b06432270b79deaac3480f3f7981d2cc52bfe9d128b.png" - }, - { - "name": "halloween-4.png", - "path": "/04/a4/04a4d0b371469ea263bdc9c85ebc21156fd183d8646ce3c1287c9941b07b62ad.png" - }, - { - "name": "Screenshot_2020-10-01_161603.png", - "path": "/a9/5d/a95dbbd84235acc361cce23ea22357be4ccdff68ed10ea5f467bd113f7da8204.png" - } - ], - "content": "

this is a freebie for everybunny!

you can download all of them below!

enjoy!

", - "edited": "Thu, 01 Oct 2020 22:21:05 GMT", - "embed": {}, - "file": { - "name": "Screenshot 2020-10-01 161603.png", - "path": "/a9/5d/a95dbbd84235acc361cce23ea22357be4ccdff68ed10ea5f467bd113f7da8204.png" - }, - "id": "42261909", - "published": "Thu, 01 Oct 2020 22:21:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "free to use october icons!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:36:44 GMT", - "attachments": [ - { - "name": "IMG_6707.jpg", - "path": "/a3/f1/a3f1cc650cc6151281875c7b328de452141bcbe82bea3c3c119b397b99f4cd65.jpg" - }, - { - "name": "IMG_6714.jpg", - "path": "/84/51/84510edf95d1d727a5ecce7e3b84eae315c70a3f868076e50fed3fba51ea8404.jpg" - } - ], - "content": "

AAAH FINALLY!! After some mishaps, the August patreon pins have arrived!!!!


I will be shipping these out this week, and I\u2019ll also upload the exclusive stationery each parcel is sent with afterwards!!!


Also, here\u2019s a peek at September\u2019s pin!! Many of you already guessed it\u2019s from Holland! \ud83c\udf37

", - "edited": "Tue, 08 Sep 2020 18:46:20 GMT", - "embed": {}, - "file": { - "name": "IMG_6707.jpg", - "path": "/a3/f1/a3f1cc650cc6151281875c7b328de452141bcbe82bea3c3c119b397b99f4cd65.jpg" - }, - "id": "41388689", - "published": "Tue, 08 Sep 2020 18:46:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "august pins shipping this week!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:39:55 GMT", - "attachments": [ - { - "name": "IMG_6235.jpg", - "path": "/37/5e/375e616b095891ecb24f52580a8af5f726d1f6a728e4d679a18b5041dedab7a2.jpg" - } - ], - "content": "

hello everyone!!!

FINALLY my postcard tier items came!!! they look so cute!! There were a few sticker malfunctions on the free launch sticker sheet but hopefully I can get things figured out \ud83d\ude2d

Pin pal enamel pins should be here this week as well! I am gradually packing everything and hope to have all the August physical tier stuff out by next week!! Thank you SO much for your patience!


September pins will ship MUCH earlier than this one because I ordered it in advance this time!!! Yahoo!

", - "edited": "Tue, 01 Sep 2020 17:00:41 GMT", - "embed": {}, - "file": { - "name": "IMG_6235.jpg", - "path": "/37/5e/375e616b095891ecb24f52580a8af5f726d1f6a728e4d679a18b5041dedab7a2.jpg" - }, - "id": "41084915", - "published": "Mon, 31 Aug 2020 23:24:35 GMT", - "service": "patreon", - "shared_file": false, - "title": "august postcard + sticker!!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:42:19 GMT", - "attachments": [ - { - "name": "IMG_5816.jpg", - "path": "/ba/6a/ba6a868daeb48d8e3a0db0ff283f58718c63b872b4c42a16f09202870e38430b.jpg" - } - ], - "content": "

hello my friends!!!!!

August pin pal club pins are finally finished!!!

(If you pledged at the end of July when Patreon launched, or before the end of this month, you will get this!)

Here\u2019s a photo from my manufacturer!!!

I\u2019ll be shipping out parcels through last week of August & beginning of September!

If you have any address changes please send me a message!

Also, please give some time for packages to arrive, as USPS is in a really difficult spot right now.

Thanks so much for all your support this month!


Reminder that if you were a $15+ pledge during the launch week in July you\u2019ll also receive a sticker sheet.

(Also, can you spy the September pin in the back? I wonder what country it could be from?)

", - "edited": "Mon, 24 Aug 2020 18:53:12 GMT", - "embed": {}, - "file": { - "name": "IMG_5816.jpg", - "path": "/ba/6a/ba6a868daeb48d8e3a0db0ff283f58718c63b872b4c42a16f09202870e38430b.jpg" - }, - "id": "40801379", - "published": "Mon, 24 Aug 2020 13:35:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "august pin pals!!!", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:49:42 GMT", - "attachments": [ - { - "name": "august_patreon.png", - "path": "/34/24/34249db5b089d7a0f5bbe1006e600aaea40f5405bde6c967066892a2f98cfb8c.png" - } - ], - "content": "

HEEHOOOOOOOO!!!!

Hello again my friends from across the globe!

Here is the August postcard + sticker design for all tiers that are Super Trooper and up ($35+)

I'm probably going to have the monthly postcard tiers screenprinted locally with a print shop I love here!!! (so when you support my small business.... you're also supporting THEIR SMALL BUSINESS!!!!! small business ception...)

Also, I want to test out nice paper... this should be on French Press' speckletone white.. sexy paper...

I will also upload the high-res files for both of these in a separate private post so that you can print as many as you'd like for personal use.


Anywhooo!

Anyone who is in the Super Trooper tiers or higher before end of this month can get this exclusive postcard + sticker! (All physical tiers will ship near the end of the month or beginning of Sept. depending on when you pledged.)

", - "edited": "Tue, 04 Aug 2020 04:08:15 GMT", - "embed": {}, - "file": { - "name": "august_patreon.png", - "path": "/34/24/34249db5b089d7a0f5bbe1006e600aaea40f5405bde6c967066892a2f98cfb8c.png" - }, - "id": "40072994", - "published": "Tue, 04 Aug 2020 04:08:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "August Postcard + Sticker ($35+ tiers)", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 03:53:35 GMT", - "attachments": [], - "content": "

EDIT: Since everyone will be charged for the moment they first join I will be using those funds for August rewards, and pausing the August 1st charge.

-----

hello friends!
thank you SO much for checking out my patreon page, and for your support!!

because I am launching this patreon near the end of July, there will be a charge for when you first join.

i want to give all physical reward tiers who join before August 1st a bonus sticker sheet for this month!

all rewards will be shipped near the end of august to give me time to produce them.

oh! and here is the pin design for the month of August! the country bun visits this month is Venezuela! I wonder what he learns and sees there? I guess we'll have to wait for his letter.

again, thank you SO much for all the love and support! i hope this will be a fun thing for everyone!! during this pandemic it's been difficult to see people or travel, so I want these monthly letters & souvenirs from bun to feel like a warm hug from a friend!

", - "edited": "Fri, 24 Jul 2020 23:15:59 GMT", - "embed": {}, - "file": {}, - "id": "39678704", - "published": "Fri, 24 Jul 2020 20:50:54 GMT", - "service": "patreon", - "shared_file": false, - "title": "welcome patrons!!! (first week patron bonus + august design)", - "user": "9210140" - }, - { - "added": "Tue, 23 Mar 2021 04:08:49 GMT", - "attachments": [ - { - "name": "Screen_Shot_2020-05-19_at_2.51.02_PM.png", - "path": "/de/5c/de5c8bed98e3ecdf659f5b3162cec369240cd187c816cfb60d518f4c6fe03e55.png" - }, - { - "name": "Untitled_Artwork_(2).png", - "path": "/a0/9f/a09f6e7cdd224b59d44f0b8b88b1d8319fa0895aec6ec6e161eac437d819e0de.png" - }, - { - "name": "van_duck_bg.jpg", - "path": "/4a/a0/4aa0021a217a4d9377a52e2aa0c2393e9466c9441396c851866d92fdc03cfc7a.jpg" - }, - { - "name": "image0.jpeg", - "path": "/58/05/5805878b7bc5e217d1c6cebe47e575eafa5d087736e1c10d9de9dc521db096f6.jpg" - }, - { - "name": "image1.png", - "path": "/e3/8c/e38cfceec967aeb155d84f9050cd2aa5bfe141096009d6ef10dab1cd9c7bf454.png" - }, - { - "name": "cart_MASTER.png", - "path": "/6f/69/6f69b18d3cb9c53f5305602242bd50896abbdee4a28f39940eb9745a49f3814c.png" - }, - { - "name": "shelf_MASTER.png", - "path": "/54/9b/549b1e4cadf22f20cfb7c5406eb2a76faa8b1a84b5cc553838e145816420a5a2.png" - }, - { - "name": "building_side_MASTER.png", - "path": "/e1/23/e1236d75356fb9b857f52b17711445cba7d3cc3e952a0218bc1ee22ea9f9c3ef.png" - } - ], - "content": "

hello patrons and perusers!!! \u00a0

this post is meant to give you an idea of the kind of behind-the-scenes stuff you'll see if you subscribe to one of my tiers!\u00a0

I have been working on a lot of branding and toy design lately for some of my characters in \"Jiji\" and am hoping to launch a kickstarter soon for a toy line! Here's some of the process work and spitballing of ideas I had for it!

Expect to see more work and images like this in paid tiers. A lot of these concepts and artworks won't be posted anywhere else!

", - "edited": "Tue, 19 May 2020 20:51:59 GMT", - "embed": {}, - "file": { - "name": "Untitled_Artwork (2).png", - "path": "/de/5c/de5c8bed98e3ecdf659f5b3162cec369240cd187c816cfb60d518f4c6fe03e55.png" - }, - "id": "37306299", - "published": "Tue, 19 May 2020 20:51:59 GMT", - "service": "patreon", - "shared_file": false, - "title": "first post! (public freebie)", - "user": "9210140" - } -] diff --git a/testing/local_constants.py b/testing/local_constants.py deleted file mode 100644 index 774f189..0000000 --- a/testing/local_constants.py +++ /dev/null @@ -1,42 +0,0 @@ -"Constants for testing" -import json - -def generate_post_ids_from_bin(bin_file : str)-> list[str]: - """This reads a bin file/basically json, and turns it into a sequence of ids - - Args: - bin_file (str): The output of Kemono's api - - Returns: - list[int]: the ids to be used - """ - id_list = [] - with open(bin_file, 'rb') as contents: - res = json.loads(contents.read().decode()) - for obj in res: - id_list.append(int(obj["id"])) - return id_list - - -FILE_DIRECTORY_PREFIX = "./testing/" -# sample real user -# https://kemono.party/patreon/user/72813 -USER1_NAME = "Shencomix" -USER1_SERVICE = "Pateron" -USER1_ID = 72813 -USER1_FIRST_PAGE = FILE_DIRECTORY_PREFIX+"shen_post_api_page_one.bin" -USER1_SECOND_PAGE = FILE_DIRECTORY_PREFIX+"shen_post_api_page_two.bin" -USER1_FIRST_PAGE_IDS = generate_post_ids_from_bin(USER1_FIRST_PAGE) -USER1_SECOND_PAGE_IDS = generate_post_ids_from_bin(USER1_SECOND_PAGE) -USER1_FIRST_HALF_FIRST_PAGE = FILE_DIRECTORY_PREFIX+"shen_post_api_page_one_first_half.json" -USER1_SECOND_HALF_FIRST_PAGE = FILE_DIRECTORY_PREFIX+"shen_post_api_page_one_second_half.json" -USER1_FIRST_HALF_POST_IDS = generate_post_ids_from_bin(USER1_FIRST_HALF_FIRST_PAGE) -USER1_SECOND_HALF_POST_IDS = generate_post_ids_from_bin(USER1_SECOND_HALF_FIRST_PAGE) - -# user 2 -# https://kemono.party/patreon/user/9210140 -USER2_NAME = "Liliuhms" -USER2_SERVICE = "Pateron" -USER2_ID = 9210140 -USER2_FIRST_PAGE = FILE_DIRECTORY_PREFIX+"liliuhms_post_api_page_one.bin" -USER2_FIRST_PAGE_IDS = generate_post_ids_from_bin(USER2_FIRST_PAGE) diff --git a/testing/output_file.bin b/testing/output_file.bin deleted file mode 100644 index e69de29..0000000 diff --git a/testing/shen_post_api_page_one.bin b/testing/shen_post_api_page_one.bin deleted file mode 100644 index d5ddd0d..0000000 --- a/testing/shen_post_api_page_one.bin +++ /dev/null @@ -1,722 +0,0 @@ -[ - { - "added": "Fri, 23 Jun 2023 10:29:54 GMT", - "attachments": [], - "content": "










", - "edited": null, - "embed": {}, - "file": {}, - "id": "84905474", - "published": "Wed, 21 Jun 2023 13:19:17 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83d\udd2e We look back.", - "user": "72813" - }, - { - "added": "Fri, 23 Jun 2023 10:30:14 GMT", - "attachments": [], - "content": "
















", - "edited": null, - "embed": {}, - "file": {}, - "id": "84778099", - "published": "Mon, 19 Jun 2023 01:29:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Lilith's Parents (Full Arc So Far)", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:17:59 GMT", - "attachments": [], - "content": "
































", - "edited": null, - "embed": {}, - "file": {}, - "id": "84238287", - "published": "Thu, 08 Jun 2023 00:12:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Lilith Remembers", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:18:59 GMT", - "attachments": [], - "content": "




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83529449", - "published": "Thu, 25 May 2023 12:57:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Your Favorite Girl", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:19:13 GMT", - "attachments": [], - "content": "

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0

\ud83d\udcf0 \u00a0News \ud83d\udcf0

\u2022 New Set: LILITH

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Type A & B

\ud83d\udcac Competitive, achievement oriented, perfectionist. That's a Type A personality.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\u2728\ud83c\udf1f\u2728 Ultra-Rare Lilith

\ud83d\udcac Some people have asked if this is canon. My response to this is that it is as canon as Nun Ana. Which is to say, it is super not canon. Like super duper not canon.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Plants on a Distant Planet

\ud83d\udcac The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Lilith

\ud83d\udcac An unfortunate girl.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Cultist

\ud83d\udcac The power cthulhu surges through him. It is too late for this world.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Blormbus

\ud83d\udcac Just regular ol' Blormbus. I added a wizard hat because I thought you might be mad if it was literally JUST Blormbus. I mean, you've seen him already. So, that's why he has a wizard hat.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Wacky Roommates

\ud83d\udcac Jerry from the iconic Shen Comix mini-series Wacky Roommates! Oh... you... you don't know what that is? Oh ...



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Blormbus

\ud83d\udcac Don't be alarmed that Blormbus is now red and slightly bigger. We just gave him an apple slice. Look, you can see him dissolving it.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83343026", - "published": "Sun, 21 May 2023 20:52:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83d\udd2e\u2728\ud83d\udd2e\u2728\ud83d\udd2e", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "", - "edited": null, - "embed": {}, - "file": {}, - "id": "83218897", - "published": "Fri, 19 May 2023 02:19:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Lilonth", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83169653", - "published": "Thu, 18 May 2023 02:50:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Lilith gets angry.", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:20:11 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83065295", - "published": "Tue, 16 May 2023 02:09:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club - Lilith's Hair", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:20:25 GMT", - "attachments": [], - "content": "

", - "edited": null, - "embed": {}, - "file": {}, - "id": "82276738", - "published": "Sun, 30 Apr 2023 13:07:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club #24 - Lilith's Parents Pt. 1", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:20:46 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "82064413", - "published": "Wed, 26 Apr 2023 03:40:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club #23 - Art Cubbies Pt. 2", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:21:12 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "81954654", - "published": "Mon, 24 Apr 2023 01:39:19 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #22 - Art Cubbies", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:21:42 GMT", - "attachments": [], - "content": "

( This update is set in the past, when Dorothy sold Leanne the blockchain \"tome\" that Leanne had spent all of Lilith's money on. )




















", - "edited": null, - "embed": {}, - "file": {}, - "id": "81851518", - "published": "Fri, 21 Apr 2023 17:41:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club #20 + #21 - Leanne's Statue", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:22:58 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "81209841", - "published": "Sat, 08 Apr 2023 03:33:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #19 - Repurpose", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:23:24 GMT", - "attachments": [], - "content": "











", - "edited": null, - "embed": {}, - "file": {}, - "id": "81059547", - "published": "Wed, 05 Apr 2023 02:03:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #18: Bofa Begins", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:24:05 GMT", - "attachments": [], - "content": "









~~ \ud83c\udf4b ~~












", - "edited": null, - "embed": {}, - "file": {}, - "id": "80704628", - "published": "Wed, 29 Mar 2023 05:48:00 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club [#16, #17] \ud83c\udf4b", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:25:12 GMT", - "attachments": [], - "content": "

I'm hoping to start posting these early here soon!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "80338946", - "published": "Tue, 21 Mar 2023 15:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club \ud83c\udf4b [ #1 - #15 ]", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:26:46 GMT", - "attachments": [], - "content": "

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0

Hi Shen Comix Patreon Community! This set of gacha rolls is generated automatically \ud83e\udd16 but delivered personally. \ud83d\udce8\u270c( So if you have any comments or questions, I'm here to respond to them! )


\ud83d\udcf0 \u00a0News \ud83d\udcf0

\u2022 New Set: PLANTS ON A DISTANT PLANET

\u2022 I know this is a day late, sorry!

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Plants on a Distant Planet

\ud83d\udcac The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Wizard

\ud83d\udcac Maple, an allegedly great and powerful dark wizard able to spawn a tornado of dark energy. Once. Before he gets dizzy.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Little Firefighter

\ud83d\udcac The outfit is snazzier but, let's be real, not much has changed.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "80190808", - "published": "Sat, 18 Mar 2023 06:14:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll!! Again! \ud83e\udea9\ud83e\udea9", - "user": "72813" - }, - { - "added": "Fri, 17 Mar 2023 16:28:56 GMT", - "attachments": [], - "content": "

Community Roll.\u00a0


--- \u2702 --- \u2702 --- \u2702 ---\u00a0

Hi Community! This set of gacha rolls is generated automatically \ud83e\udd16 but delivered personally. \ud83d\udce8\u270c( So if you have any comments or questions, I'm here to respond to them! )


\ud83d\udcf0 \u00a0News \ud83d\udcf0

\u2022 New Sets: D&D CHARACTER, WIZARDS

\u2022 Updated Art: LITTLE FIREFIGHTER

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare D&D Character

\ud83d\udcac Miligo, a D&D character I play in my friend's campaign. She's a ball of aggression and insecurity who tried to intimidate a book once.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common The Guy

\ud83d\udcac The Guy prior to the rogue transformation. Extremely powerful, but only against ankles, just like my Elden Ring character.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Season

\ud83d\udcac The youngest season, and their cynical and slightly-goth older sibling.


Community roll.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "79994633", - "published": "Tue, 14 Mar 2023 04:26:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll! \ud83e\udea9", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:26:13 GMT", - "attachments": [], - "content": "



Badguy wonders why the moon is rising.

He has never seen the moon rise during the day like this.


Especially not sideways.


Oh.


You plummet towards Badguy, wielding your newly crafted MOONPICK.


He throws out a slash.



( You're about this close now. )


Another slash.



( You're pretty much there. )


You land powerfully in front of Badguy.


In classic bad guy fashion, Badguy begins smugly monologuing about how your MOONPICK has been rendered useless.


You bonk him on the head with the MOONHAMMER.


Badguy goes down instantly.


You decide that these 2 artifacts are simply too powerful for the hands of humans.


You have to get rid of them. Put them somewhere where they will never be found.


So you give them to Shen, who almost immediately loses them. That dude has a talent for losing things. When he loses something, it might as well be in the void of space.


All according to plan.


Then, finally, you decide to live out a dream you've had for a while.


You build yourself a dirt hovel.


Badguy has built a significantly more impressive one next to yours and is currently pouting in it.


It's okay, you think.

You'll let Badguy have this one.







", - "edited": null, - "embed": {}, - "file": {}, - "id": "78434719", - "published": "Thu, 09 Feb 2023 02:04:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy (Finale Pt. 2)", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:27:34 GMT", - "attachments": [], - "content": "

You arrive at the STONEJACK'S AXE to find that somebody got to it first.


A strong wind billows through the valley, but the stone tree which once held the axe does not sway, and neither does it's new holder ...


Which is BADGUY. Badguy now has the axe. Or maybe it has him.

In any case, you sense a battle brewing.


Luckily, you have that PICKAXE you swiped from MINER CHARACTER.


And you use it to ...


... \u26a0\ufe0f ESCAPE!! \u26a0\ufe0f


But Badguy is having none of it.


He uses the Stonejack's Axe to slash apart the very air around you


sending you plummeting down!


As you careen towards the earth, you have only one tool, and one option.


You mine. You mine faster and harder than you've ever mined before.

Of course that's not saying much, since you were never much of a miner. The point of reference is 0 here.


But suffice to say, you mine very fast.


In fact, you mine all the way through the planet, to the NIGHTTIME SIDE, where the momentum once again carries you into the sky.


Ah, the moon.

Isn't it beautiful?




", - "edited": null, - "embed": {}, - "file": {}, - "id": "77440488", - "published": "Thu, 19 Jan 2023 04:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy { Finale Pt.1 }", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:28:37 GMT", - "attachments": [], - "content": "

Hey peeps,

Thank you for your patience as I haven't been active on here in the past couple of weeks. I wanted to briefly talk about a few things.

---

1) I give up ON promoting the Patreon as hard as I have been on social media. Mind you, I don't give up on the Patreon itself, just on promoting it that hard.

But I feel like I've hit a point of diminishing returns (in terms of bringing in new people thru ads), and it's just not worth if for me to spend like an entire workday on a Patreon ad.

That being said, the amount y'all support me on here ... is to say the least, nothing to sneeze at!! Which brings me to my next point:

---

2) THANK YOU!! For your support on here. A lot of you seem to be willing to support me even when my activity slows down -- you're absolute angels to do that, and it's something I don't really... expect from an audience? Like, it goes against a lot of conventional wisdom? \ud83d\ude05

Also, y'all don't owe me this at all. I see a lot of explanation and apologies in exit surveys and it's like, no... bro.... sis..... h-honey. You do you. I'm not gonna be mad at you for cancelling lmao, for any reason.

---

3) I'm deathly bored of You Are the Guy. I think I just got too up my own ass with lore in it, and once you get too up your own ass with lore, it is difficult to exit the ass.

It's like you're juggling all of these little plot elements you put into play, and just like with juggling, you have to catch every single one. Whether you throw it back into the air for another spin or not is up to you, but you have to at least catch it. If you don't catch them ... well, it just looks clumsy.

And boy did I throw a lot of balls.

It was supposed to be a simple, goofy little series, and I just had to do it. And so as a result, I'm just having trouble putting pen to paper on that series right now. Realistically, my options are:

1) Chaotic Neutral: Take the reigns of The Guy and try to steer the series in some direction.

2) Lawful Good: Take those reigns and bring it to a clean close.

3) Chaotic Evil: Abandon it.

Lmk what you think.

---

4) Lilith


", - "edited": null, - "embed": {}, - "file": {}, - "id": "76755887", - "published": "Wed, 04 Jan 2023 01:21:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "I'm Back! \u270c\ufe0f + I \"Give Up\" \ud83d\ude2b (Not Really)", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:28:39 GMT", - "attachments": [], - "content": "

The Guy opts for a Secret 5th Option, which turns out to be ...


You consult a gamefaqs guide in the only way you know how, on your 1996 IBM PC 340 on top of a large hardwood table with a kitchen chair pulled up to it.

You're always finding reasons to pulled out that stinky ole 1996 IBM PC 340.


Absolutely shameless.


Oh hell yeah. HELL yeah.


[ Table of Contents ]

~~~ / | | \\ ~~~

Pg. 01 - Table of Contents
Pg. 02 - Intro
Pg. 03 - General Strategy
Pg. 04 - The Tech Tree
Pg. 05 - Walkthrough
--> Pg. 05 - Starting Valley
--> Pg. 06 - Pitch-Black Cavern
--> Pg. 07 - The Mountain
--> Pg. 09 - Shen's House Interlude
--> Pg. 09 - Return to Starting Valley
--> Pg. 10 - Non-Canonical [?] Eden Level

~~~ \\ | | / ~~~

[ Author's Note ]

This guide is note currently complete as I am stuck on Non-Canonical Eden Level.
If anyone knows how to get through this part, please send me a DM or post it in
the thread which I check daily. I got the axe but can't find what I'm supposed
to use it on.


[ The Stonejack's Axe ]

If you turn to the left on the intersection out of the house, you enter an area
called [ Deepwoods ] -- It's actually a pretty straightforward path through this
area and into the valley on the other side. Some people have written that there
is a chance for an enemy to spawn here (\"tall bear, doesn't like sunlight\"),
though I've yet to encounter this enemy personally.

Getting through [ Deepwoods ] will get you to [ Desolate Valley ], where you can
find [ Stonejack's Axe ] lodged into a tree made of stone near the entrance to
the mountains. Don't tech into Sweaty before pulling out this axe, as that makes
pulling it out of the stone tree an Impossible class skillcheck.


Well, now you know about the Stonejack's Axe, I guess!


To ascertain this, we will have to look deep, deep into the darkest recesses of The Guy's mind. I'm not sure you're ready for this.


Okay, he appears to want to dig a hole.


He is in the hole now. It's not very deep. His intentions are unclear.


He made himself a little hovel. He wants to live in a little hovel. It looks like it might even have a fireplace in it? This is what The Guy wants.


With this new wealth of knowledge, will you still go back to your friends? Or is there anything you wish to do beforehand?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75926672", - "published": "Wed, 14 Dec 2022 21:48:41 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guyde", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:29:25 GMT", - "attachments": [], - "content": "

Hello dear patrons,

I wanted to make you an offer. Two comics I will never post, and why I'll never post them, in exchange for unlocking the first 11 updates of EDEN Season 1 ( up to them Truffle & Mia getting the radio ) + the first 11 updates of You Are the Guy ( up to us meeting The Mountain Bastard for the first time ) to the Public setting here.

I was just making a patreon ad and trying to cram as many preview panels into it as I could and got to thinking \"dang, I'm really asking potential patrons to take a plunge here into something they don't know anything about. shouldn't I give them a preview?\"

So, this plan is my attempt to do that! Currently I don't see a reason to make it rolling or anything (with more updates being made free as we go), but I guess I'll take y'all's advice on that.

---

Here are the comics I want to offer on this altar.

I never ended up posting this one, because I was worried it'd be misread, and instead I posted this way more verbose one:

Looking at it now, tbh I would've felt better about posting the first cuz it's got more fun artwork, and because the second one strafes a bit too close to just being boring moralization. The We \u2665\ufe0f Haters cake is funny tho.

Here's another:

I had a nagging feeling in the back of my mind about this one, like \"damn, this seems like such an obvious 3-panel, I wonder why nobody made it yet.\"

Well turns out somebody had.

And in classic form, it was KG Green 10 years ago.

https://gunshowcomic.com/513\u00a0

It's always KC Green 10 Years Ago. Always.

It's not that I had never seen this comic, but I just didn't have it in mind as I was making mine. Somebody replied with KC's and I was like \"aaah shit\" and deleted it just a few min after posting.

---

So here's that. What do you think?

I know I've just handed you a CD \"for free\" and then asked for $5 for it like a hustler in the New York subway, but in this case you are actually free to decline -- if the overwhelming response is \"no, keep it completely locked because that's how it was pitched to us,\" I will respect that.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75710038", - "published": "Fri, 09 Dec 2022 15:25:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "Let's make a deal.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:29:46 GMT", - "attachments": [], - "content": "

The people have spoken.

You now have Double Brain, Time Vision, Wide, and Regeneration. Next time, you'll be able to tech as far as Sweaty or Moon Grab!

Timetosis is at its end. The timelines begin to remerge.

As you float drift the chaos of timespace, you consider all of the choices that have lead to you drifting through the chaos of timespace. Who has been making those choices, you wonder? You? God? A pantheon of approximately 1000 gods all yelling over each other??

That last one's kinda a stretch, but then again, you're more stretched that ever right now. It's like a grandma pinched your cheeks, and that grandma also happened to be a body builder.

We're back in the main timeline.

Small Yoyo is intimidated by the sudden surge in your power.

Small Yoyo flees! You are victorious but gain no XP because, well

Anyway, it looks like you have full run of the place with that critter out of the way.

Using both of your brains, you can vaguely extrapolate where you are right now.

You are, of course, outside of the map, in a zone known as Abyssal Unreality. You can hop back in whenever & wherever you want though.

So what will you do now? Reunite with your friends? Go after Yoyo? Check out that cave, or the unkown area to the left?

Or a secret, fucked up 5th thing?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75580104", - "published": "Tue, 06 Dec 2022 15:07:46 GMT", - "service": "patreon", - "shared_file": false, - "title": "TIMETOSIS: OVER", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:30:30 GMT", - "attachments": [], - "content": "

You spit the above sick lines. Now all that's left it to drop the mic.

There is goes.

Yes. Hell yes.

You say that other thing! But unfortunately you can't drop the mic any harder than it has already been dropped.

Look at it. It is literally clipping into the ground.

Just one more attack should finish this. But what?

You decide to do all of those things

at the same time.

It sounds like this:

The scream is so loud in fact that it emanates out of your current temporary timeline and into the adjacent permanent timeline ...

... where it is heard by the people gathered on the first floor,

It was 26 years ago that Badguy was born, but today, for the very first time in his life, he is compelled to speak.

The Sky is defeated. You once again feel power surging through you.

You gain 2 more XP!

How will you spend it?

You already have Double Brain and Time Vision.

Keep in mind that you can advance from the root too. So for your first one, for example, you could get any of these:

Waddaya want?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75157411", - "published": "Sun, 27 Nov 2022 04:50:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "Rap Battle Against the Sky", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:31:45 GMT", - "attachments": [], - "content": "

The people have spoken.

You now have two brains AND can see the potential consequences of anything you do.

In fact, you're getting a vision from Time right now.

You're not sure what this means.

Wait, hold up, Time is giving you a vision again.

Oh.

You need regeneration to survive on fire. Got it.

Now all that's left to do is fighting the sky. But... how do you even fight the sky? Oh, you got it. Here's an idea.

Hell yes.

Bring it home, chat.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75022239", - "published": "Wed, 23 Nov 2022 16:22:40 GMT", - "service": "patreon", - "shared_file": false, - "title": "Fight the sky.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:32:21 GMT", - "attachments": [], - "content": "

You wavedash just out of the range of his Mountain Buster.

Get baited.

You suddenly feel more powerful... in fact, you gain 2 XP to use on the tech tree.

How will you spend them.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74916213", - "published": "Mon, 21 Nov 2022 04:21:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Wavedash", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:32:50 GMT", - "attachments": [], - "content": "

You go in for a mighty kick.

HE BLOCKED LOW!!! OH MY GOD, HE BLOCKED LOW!!!

This is the first dude who has ever actually blocked your kick.

He's going in for the \ud83d\uddfb Mountain Buster \ud83d\uddfb now. That's about to be half your health bar unless you do something

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74693973", - "published": "Tue, 15 Nov 2022 18:23:08 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick HIM in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:33:09 GMT", - "attachments": [], - "content": "

No shins to speak of, I'm afraid. Only forearms. How do you even defeat an entity with just forearms?

Timetosis isn't permanent, so you better find a way to get more powerful while it lasts. Wait is this before, or after you pushed the Mountain Bastard down the mountain?


After. Clearly after.

What do you want to do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74245334", - "published": "Fri, 04 Nov 2022 23:18:13 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick him in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:33:44 GMT", - "attachments": [], - "content": "

Hey y'all,

Thanks so much for your patience while I did the Halloween event. \ud83d\ude01\ud83d\ude01 As mentioned before, I'm going to take a week off -- I'm hoping to make that next week 11/7-11/13. Before that I want to get done:

[1] gacha distribution (that's happening tonight, so check your inbox soon if you're in that tier!) and

[2] a You Are the Guy update -- That will likely be tomorrow or Friday.

In case you missed the Halloween event, I'll post it right here in it's entirety:

Thank you, as always, for your patronage, and I'll see you in the next post.

It's okay if you're imagining that last face saying that.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74158934", - "published": "Thu, 03 Nov 2022 03:43:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "And I'm back!", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:34:43 GMT", - "attachments": [], - "content": "

Hey y'all

[1] In the interest of pure transparency, I wanted to say that I really need to prioritize that Halloween profile pic thing that I do every year right now. Those take... so much work. \ud83d\ude2d You'd think \"it's just a picture a day, how long could it take,\" but lemme tell ya, I think that every year and every year I'm wrong.

So I'm not saying there 100% WON'T be any Patreon stuff while I'm preparing for and doing that, but there might not be, or if there are they might at least be slower than usual.

[2] After October, at the beginning of November, I was also hoping to take a week break. Over the years that I've been doing comics, tbh, I have had trouble even taking weekends. In part this is my own fault cuz I get very distracted and disorganized. It feels like a massive risk for me to be deliberately gone from online for an entire week, but I want to try it. Maybe it will be healthy.

Thank you for reading! Please enjoy this here gacha roll. :]

\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\u2728\ud83c\udf1f\u2728 ULTRA-RARE SMOL GHOST


\ud83d\udcac This isn't even a real character that has ever shown up. I literally just made this guy up, swear to god.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 RARE SEASON

\ud83d\udcac The youngest season, and their cynical and slightly-goth older sibling.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 RARE WACKY ROOMMATES

\ud83d\udcac The other guy from Wacky Roommates, who never really had a name. He had a role though -- the straight main to Jerry's WACKY ANTICS!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "73468219", - "published": "Tue, 18 Oct 2022 18:16:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Patreon Update + A Gacha Roll! \ud83d\udd2e", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:34:49 GMT", - "attachments": [], - "content": "

Now what?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "73194386", - "published": "Wed, 12 Oct 2022 02:43:35 GMT", - "service": "patreon", - "shared_file": false, - "title": "F5 to quicksave.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:35:31 GMT", - "attachments": [], - "content": "

You walk to the end of the level. This IS the end, right? I mean, it must be, look at that massive cave. That's an end-of-the-level cave if I've ever seen one. Probably means a cave level is next and that always sucks.

Also, you're pretty far from Badguy at this point. Look at his tiny location indicator.

There's something a lot closer, and it's approaching fast.

You equip the Foot Scope.

You've still got a bit of time before it gets here. Any other precautions you wanna take?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72942785", - "published": "Thu, 06 Oct 2022 02:23:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "Walk on to the end of the level.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:35:52 GMT", - "attachments": [], - "content": "

You jank yourself into that corner. It's like you're trying to get into the backrooms, you're janking so hard. Holy shit. Badguy looks on in astonishment.

Well, you did it. You're out of bounds now. I'm not sure what you were hoping to accomplish through this, but hey, you are the guy I guess.

Meanwhile, downstairs, Mouse Demigod has totally fallen for your trick, and is drinking the potion! A classic blunder.

His class is being randomized! What will it be?? WHAT WILL IT BE???

Well, that's random numbers for you.

Mouse Paladin makes his way upstairs, but he's pretty harmless now. Hey, wasn't there a purple guy with you? Where is that guy?

(You're up here.)

Oh by the way, Miner Character has arrived at the door. It may be about to get pretty crowded in there.

(Not that you're low on space.)

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72646675", - "published": "Thu, 29 Sep 2022 19:45:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "Clip out of bounds.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:36:21 GMT", - "attachments": [], - "content": "

Tag | (No archive for this one, to save time) [ \ud83d\udcbe\u2728 First 11 Updates Free ] [ You might need to scroll down a bit for them, sorry lol ]

Archive | Tag\u00a0[ \ud83d\udcbe\u2728 First 11 Updates Free ]

Archive | Tag

Post\u00a0

Serious Art 1 | Serious Art 2\u00a0

Meme Comic Remaster 1 | Meme Comic Remaster 2\u00a0

This is available @ the \"NICE + Gacha\" tier!

Explanation

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72467685", - "published": "Sun, 25 Sep 2022 22:28:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "\u2728 Patreon-Exclusive Content Archive \u2728", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:36:41 GMT", - "attachments": [], - "content": "

The ensmallening spell wears off, and you and Badguy burst out of the box and back into that small basement room.

You decide to head upstairs and explore the house. But behind you, you leave the rest of the Class Randomization Potion, with a \"DRINK ME\" label on it.

Around this time, the Mouse Demigod reaches what I've come to call the Shitshow Door.

The mouse has arrived. Let's see what's going on upstairs.

There's something here with you. It knows you're a stranger to this world, and it is not fond of your intrusion. If I were to proceed at all, I'd proceed carefully.

This area feels a bit

whimsical.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72405353", - "published": "Sat, 24 Sep 2022 13:00:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Leave the box.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:37:08 GMT", - "attachments": [], - "content": "

You have hornswoggled him so hard. He is so hornswoggled he doesn't even know what happened, look at how happy he is. He thinks he won.

He drinks his half of the potion.

Uh oh! Turns out it was a Class Randomizing Potion. Badguy is now a ...

Corn Paladin

Meanwhile, Shen has left behind the NOT CANON Sign and resorted to digging.

There are now three characters on their way to your location. Mouse Demigod is the fastest on account of being able to fly. Shen and Miner Character are underground, where Miner Character is obviously faster.

He's like a fish in water down there.

Back to you. You're small, in a box, with a corn paladin.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72310762", - "published": "Thu, 22 Sep 2022 00:38:12 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hornswoggle Badguy", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:37:36 GMT", - "attachments": [], - "content": "

You decide to take over the store, and embark on the noble endeavor of entreprneurshisp.

Badguy asks if he can get a friend discount on the potion.

The fool. There are no friends in entpruetenirship.

Let's check up on Shen.

Wait, 53%? Wasn't he at 79 before? Why is he going backwards??

Oh, he's being pelted by a hail of nails. He's running for his life. The not canon sign is probably broken, huh? The internal electrical components must be all sorts of fucked up now.

Wait, does it even run on electricity?

Did it even ever work at all?

Let's turn the camera to see what's sending these nails.

Badguy really wants that potion.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72205399", - "published": "Mon, 19 Sep 2022 20:08:23 GMT", - "service": "patreon", - "shared_file": false, - "title": "Sell the items. Be the mouse.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:08 GMT", - "attachments": [], - "content": "

You use your thief snatch to steal .... the mouse. Not any of the mouse's ware, but the mouse himself.

The mouse is now in your thiefventory, along with the very concept of weapons.

I'm sure that was nothing.

Anyway, you have full access to all the wares from the mouse shop now. Sweet!

Shen is 79% of the way there with the NOT CANON sign. He's looking pretty tuckered out.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72091429", - "published": "Sat, 17 Sep 2022 13:01:01 GMT", - "service": "patreon", - "shared_file": false, - "title": "Thief skill activate: steal the mouse", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:38 GMT", - "attachments": [], - "content": "

Hey y'all,

I wanna do an ad for the patreon today, and I need some quotes for it.

Like you know how on the back of a book they'll have quotes about how sicknasty the book is? It's like that, but for this. Can you give me some quotes that that I can use in the patreon ad??

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72030404", - "published": "Thu, 15 Sep 2022 19:26:40 GMT", - "service": "patreon", - "shared_file": false, - "title": "What do you think about the Patreon?", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:38 GMT", - "attachments": [], - "content": "

Badguy works some of his mage warlock wizardry and begins to shrink you both.

You're both tiny now.

Badguy climbs into the box too.

All there is in here is a mouse shop. Seems like a mouse is selling some wares.

Now this is a classic mouse shop bullshit. You don't even know what half of this stuff is. Is that just a tiny green pyramid? Why is there a normal-sized nail but a tiny hammer? Is that just straight up a piece of lint?

Classic mouse shop bullshit.

Let's see how Shen's doing.

Shen's 37% of the way there with his NOT CANON sign.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72001916", - "published": "Thu, 15 Sep 2022 13:00:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask Badguy to shrink you both", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:01 GMT", - "attachments": [], - "content": "

You get into one of the boxes. Your body fits in there but unfortunately your head can't quite fit.

Hey.

Hey don't be mad at me for this call. I actually made the boxes bigger for this panel y'know, I scaled them up.

Meanwhile, Shen is running as fast as he can with the Not Canon sign, making his way to your location.

He's tuckered out. Look at this doofus. He's tired.

He's eating a PB&J now.

Meanwhile, Badguy is getting a little jealous that you have a box and he doesn't. And don't even look at this other boxes. Clearly there is only one guy-sized box here.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71756991", - "published": "Sat, 10 Sep 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hide in the boxes.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:18 GMT", - "attachments": [], - "content": "

You apologize to The Bad Guy for kicking him in the shin.

The Bad guy breaks out in tears. Maybe that's all that was needed. Although he did, y'know, try to steal your smile.

You decide to investigate the door together, now as Friends(?).

Oh. Oh no, this isn't even the right adventure.

You really shouldn't be here. Just turn around and walk back out. Please.

Hold on, I'm getting the big \"NOT CANON\" sign.

Don't.

Touch.

Anything.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71677434", - "published": "Thu, 08 Sep 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Apologize for kicking him in the shin", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:33 GMT", - "attachments": [ - { - "name": "title card.png", - "path": "/75/b5/75b5a46f358890238a5c7e35a1cf01cf3483211bb0b91060fc28db67dbe775a6.png" - }, - { - "name": "[ Audio Log ] Patching.mp3", - "path": "/25/22/2522a5246e79041fb5168c804d6f137dd1e4b8ca86a50fa587f8ce1cfe18701c.mp3" - } - ], - "content": "




", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Patching.mp3", - "path": "/25/22/2522a5246e79041fb5168c804d6f137dd1e4b8ca86a50fa587f8ce1cfe18701c.mp3" - }, - "id": "71623437", - "published": "Wed, 07 Sep 2022 00:21:50 GMT", - "service": "patreon", - "shared_file": false, - "title": "23. Patching", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:40:55 GMT", - "attachments": [], - "content": "

Okay! Time to continue this. But how?

You're ... not sure what this has to do with anything.

Okay! Yeah, this is something. I mean, there's an extra guy, but this is something.

Ah! They're falling on a pillow now. Excellent.

But it's on fire. Oh god, everything's on fire.

Okay, you are the guy again. Everything's on fire. The Bad Guy is still tusslin. There's a pillow and a door in the background.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71380943", - "published": "Thu, 01 Sep 2022 19:54:23 GMT", - "service": "patreon", - "shared_file": false, - "title": "You made this one.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:41:38 GMT", - "attachments": [], - "content": "



You devour an entire jar of pickles in the middle of the kitchen floor like a neanderthal.

Or maybe that's not a fair comparison. Has a neanderthal ever, in the history of the world, eaten a pickle? How would that even happen? Could it be that some freak accident in nature once created a single pickle, that a neanderthal then picked up and ate, never to taste that salty, scrumptious goodness again?

You think these thoughts.

Nourishment++

Ideation++


You're pumped up and ready to make this next update.

Okay, let's see here ...

The Guy is suplexing The Bad Guy down a mountain. No wait, this already happened. You need to draw what happens next. New layer! NEW LAYER!

Ah, yes, a new layer. Pristine. Untainted by the sins of your pen, but not for long.

What do you wish to draw?

You can say stuff like \"draw a circle\" or \"draw an eye\" or \"draw some squiggles.\" It's kind of like twitch plays pokemon, I'm just gonna do all of the comments in order (though I may move on to a new layer every 10 or so!)

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71238640", - "published": "Tue, 30 Aug 2022 13:25:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Nourishment.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:01 GMT", - "attachments": [], - "content": "

\u00a0I mean, you could do that.

You feel like it would kinda be cheating though.


NO!! FOILED BY YOURSELF!!!

You go give yourself a middle finger in the mirror.

You're starting to grow a mustache. That never looks good on you. You've never been a mustache guy. Beard? Sure. Sideburns? Great. It's the mustache where it all goes wrong.

Oh well, it's not like you go outside anyway. And nobody can see half your face when you do.

Hm... that update is due pretty soon.

Your meters are kinda in the red, according to your status square.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71182880", - "published": "Mon, 29 Aug 2022 16:04:31 GMT", - "service": "patreon", - "shared_file": false, - "title": "Add your own comment and choose it.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:23 GMT", - "attachments": [], - "content": "

You pop out of the snow behind The Bad guy.

You hug him with all your might ...

And then suplex him off the mountain.

As you fall, it occurs to you that you've been being pretty evil lately.

But that's not your fault. You are merely The Guy, after all. It's not even the commenters' fault. It's the fault of the person picking the comments.

You are now Shen. You're looking at this post, trying to pick the next comment to draw. What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71135747", - "published": "Sun, 28 Aug 2022 13:01:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hug The Bad Guy so he won't be bad", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:45 GMT", - "attachments": [], - "content": "

Before he pulls off his hat, you decide to hide with the speed and effectiveness that only a true rogue can muster.

Flawless.

He has no idea where you are.

You could've stabbed him in the back right now if you hadn't stolen the concept of weapons.

Also I think the sky is trying to snitch on you. You suppose that's what you get for messing with the Mountain Bastard.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71087979", - "published": "Sat, 27 Aug 2022 13:01:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "You're a rogue now, hide.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:43:02 GMT", - "attachments": [ - { - "name": "[ Audio Log ] Demolition.mp3", - "path": "/aa/78/aa788eadacd5955d9e8cf660ee5a8d1efae96eabccb913ec1d7cbb6011308739.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

All roads suddenly converge. The two paths in the wood lead to the same dark house. Both cups of tea are poisoned. And those distinct memories you have in your childhood, of seeing two moons in the sky? You must just have been seeing double.

Because only one story remains, and it's up next:

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Demolition.mp3", - "path": "/aa/78/aa788eadacd5955d9e8cf660ee5a8d1efae96eabccb913ec1d7cbb6011308739.mp3" - }, - "id": "71070581", - "published": "Fri, 26 Aug 2022 16:05:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "22. Demolition", - "user": "72813" - } -] diff --git a/testing/shen_post_api_page_one.json b/testing/shen_post_api_page_one.json deleted file mode 100644 index d5ddd0d..0000000 --- a/testing/shen_post_api_page_one.json +++ /dev/null @@ -1,722 +0,0 @@ -[ - { - "added": "Fri, 23 Jun 2023 10:29:54 GMT", - "attachments": [], - "content": "










", - "edited": null, - "embed": {}, - "file": {}, - "id": "84905474", - "published": "Wed, 21 Jun 2023 13:19:17 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83d\udd2e We look back.", - "user": "72813" - }, - { - "added": "Fri, 23 Jun 2023 10:30:14 GMT", - "attachments": [], - "content": "
















", - "edited": null, - "embed": {}, - "file": {}, - "id": "84778099", - "published": "Mon, 19 Jun 2023 01:29:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Lilith's Parents (Full Arc So Far)", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:17:59 GMT", - "attachments": [], - "content": "
































", - "edited": null, - "embed": {}, - "file": {}, - "id": "84238287", - "published": "Thu, 08 Jun 2023 00:12:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Lilith Remembers", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:18:59 GMT", - "attachments": [], - "content": "




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83529449", - "published": "Thu, 25 May 2023 12:57:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Your Favorite Girl", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:19:13 GMT", - "attachments": [], - "content": "

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0

\ud83d\udcf0 \u00a0News \ud83d\udcf0

\u2022 New Set: LILITH

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Type A & B

\ud83d\udcac Competitive, achievement oriented, perfectionist. That's a Type A personality.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\u2728\ud83c\udf1f\u2728 Ultra-Rare Lilith

\ud83d\udcac Some people have asked if this is canon. My response to this is that it is as canon as Nun Ana. Which is to say, it is super not canon. Like super duper not canon.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Plants on a Distant Planet

\ud83d\udcac The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Lilith

\ud83d\udcac An unfortunate girl.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Cultist

\ud83d\udcac The power cthulhu surges through him. It is too late for this world.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Blormbus

\ud83d\udcac Just regular ol' Blormbus. I added a wizard hat because I thought you might be mad if it was literally JUST Blormbus. I mean, you've seen him already. So, that's why he has a wizard hat.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Wacky Roommates

\ud83d\udcac Jerry from the iconic Shen Comix mini-series Wacky Roommates! Oh... you... you don't know what that is? Oh ...



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Blormbus

\ud83d\udcac Don't be alarmed that Blormbus is now red and slightly bigger. We just gave him an apple slice. Look, you can see him dissolving it.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83343026", - "published": "Sun, 21 May 2023 20:52:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83d\udd2e\u2728\ud83d\udd2e\u2728\ud83d\udd2e", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "", - "edited": null, - "embed": {}, - "file": {}, - "id": "83218897", - "published": "Fri, 19 May 2023 02:19:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Lilonth", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83169653", - "published": "Thu, 18 May 2023 02:50:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Lilith gets angry.", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:20:11 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83065295", - "published": "Tue, 16 May 2023 02:09:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club - Lilith's Hair", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:20:25 GMT", - "attachments": [], - "content": "

", - "edited": null, - "embed": {}, - "file": {}, - "id": "82276738", - "published": "Sun, 30 Apr 2023 13:07:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club #24 - Lilith's Parents Pt. 1", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:20:46 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "82064413", - "published": "Wed, 26 Apr 2023 03:40:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club #23 - Art Cubbies Pt. 2", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:21:12 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "81954654", - "published": "Mon, 24 Apr 2023 01:39:19 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #22 - Art Cubbies", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:21:42 GMT", - "attachments": [], - "content": "

( This update is set in the past, when Dorothy sold Leanne the blockchain \"tome\" that Leanne had spent all of Lilith's money on. )




















", - "edited": null, - "embed": {}, - "file": {}, - "id": "81851518", - "published": "Fri, 21 Apr 2023 17:41:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club #20 + #21 - Leanne's Statue", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:22:58 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "81209841", - "published": "Sat, 08 Apr 2023 03:33:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #19 - Repurpose", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:23:24 GMT", - "attachments": [], - "content": "











", - "edited": null, - "embed": {}, - "file": {}, - "id": "81059547", - "published": "Wed, 05 Apr 2023 02:03:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #18: Bofa Begins", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:24:05 GMT", - "attachments": [], - "content": "









~~ \ud83c\udf4b ~~












", - "edited": null, - "embed": {}, - "file": {}, - "id": "80704628", - "published": "Wed, 29 Mar 2023 05:48:00 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club [#16, #17] \ud83c\udf4b", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:25:12 GMT", - "attachments": [], - "content": "

I'm hoping to start posting these early here soon!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "80338946", - "published": "Tue, 21 Mar 2023 15:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "\ud83c\udf4b Public U. Art Club \ud83c\udf4b [ #1 - #15 ]", - "user": "72813" - }, - { - "added": "Thu, 15 Jun 2023 16:26:46 GMT", - "attachments": [], - "content": "

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0

Hi Shen Comix Patreon Community! This set of gacha rolls is generated automatically \ud83e\udd16 but delivered personally. \ud83d\udce8\u270c( So if you have any comments or questions, I'm here to respond to them! )


\ud83d\udcf0 \u00a0News \ud83d\udcf0

\u2022 New Set: PLANTS ON A DISTANT PLANET

\u2022 I know this is a day late, sorry!

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Plants on a Distant Planet

\ud83d\udcac The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common Wizard

\ud83d\udcac Maple, an allegedly great and powerful dark wizard able to spawn a tornado of dark energy. Once. Before he gets dizzy.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Little Firefighter

\ud83d\udcac The outfit is snazzier but, let's be real, not much has changed.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "80190808", - "published": "Sat, 18 Mar 2023 06:14:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll!! Again! \ud83e\udea9\ud83e\udea9", - "user": "72813" - }, - { - "added": "Fri, 17 Mar 2023 16:28:56 GMT", - "attachments": [], - "content": "

Community Roll.\u00a0


--- \u2702 --- \u2702 --- \u2702 ---\u00a0

Hi Community! This set of gacha rolls is generated automatically \ud83e\udd16 but delivered personally. \ud83d\udce8\u270c( So if you have any comments or questions, I'm here to respond to them! )


\ud83d\udcf0 \u00a0News \ud83d\udcf0

\u2022 New Sets: D&D CHARACTER, WIZARDS

\u2022 Updated Art: LITTLE FIREFIGHTER

\u00a0--- \u2702 --- \u2702 --- \u2702 ---\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare D&D Character

\ud83d\udcac Miligo, a D&D character I play in my friend's campaign. She's a ball of aggression and insecurity who tried to intimidate a book once.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d Common The Guy

\ud83d\udcac The Guy prior to the rogue transformation. Extremely powerful, but only against ankles, just like my Elden Ring character.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 Rare Season

\ud83d\udcac The youngest season, and their cynical and slightly-goth older sibling.


Community roll.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "79994633", - "published": "Tue, 14 Mar 2023 04:26:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll! \ud83e\udea9", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:26:13 GMT", - "attachments": [], - "content": "



Badguy wonders why the moon is rising.

He has never seen the moon rise during the day like this.


Especially not sideways.


Oh.


You plummet towards Badguy, wielding your newly crafted MOONPICK.


He throws out a slash.



( You're about this close now. )


Another slash.



( You're pretty much there. )


You land powerfully in front of Badguy.


In classic bad guy fashion, Badguy begins smugly monologuing about how your MOONPICK has been rendered useless.


You bonk him on the head with the MOONHAMMER.


Badguy goes down instantly.


You decide that these 2 artifacts are simply too powerful for the hands of humans.


You have to get rid of them. Put them somewhere where they will never be found.


So you give them to Shen, who almost immediately loses them. That dude has a talent for losing things. When he loses something, it might as well be in the void of space.


All according to plan.


Then, finally, you decide to live out a dream you've had for a while.


You build yourself a dirt hovel.


Badguy has built a significantly more impressive one next to yours and is currently pouting in it.


It's okay, you think.

You'll let Badguy have this one.







", - "edited": null, - "embed": {}, - "file": {}, - "id": "78434719", - "published": "Thu, 09 Feb 2023 02:04:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy (Finale Pt. 2)", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:27:34 GMT", - "attachments": [], - "content": "

You arrive at the STONEJACK'S AXE to find that somebody got to it first.


A strong wind billows through the valley, but the stone tree which once held the axe does not sway, and neither does it's new holder ...


Which is BADGUY. Badguy now has the axe. Or maybe it has him.

In any case, you sense a battle brewing.


Luckily, you have that PICKAXE you swiped from MINER CHARACTER.


And you use it to ...


... \u26a0\ufe0f ESCAPE!! \u26a0\ufe0f


But Badguy is having none of it.


He uses the Stonejack's Axe to slash apart the very air around you


sending you plummeting down!


As you careen towards the earth, you have only one tool, and one option.


You mine. You mine faster and harder than you've ever mined before.

Of course that's not saying much, since you were never much of a miner. The point of reference is 0 here.


But suffice to say, you mine very fast.


In fact, you mine all the way through the planet, to the NIGHTTIME SIDE, where the momentum once again carries you into the sky.


Ah, the moon.

Isn't it beautiful?




", - "edited": null, - "embed": {}, - "file": {}, - "id": "77440488", - "published": "Thu, 19 Jan 2023 04:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy { Finale Pt.1 }", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:28:37 GMT", - "attachments": [], - "content": "

Hey peeps,

Thank you for your patience as I haven't been active on here in the past couple of weeks. I wanted to briefly talk about a few things.

---

1) I give up ON promoting the Patreon as hard as I have been on social media. Mind you, I don't give up on the Patreon itself, just on promoting it that hard.

But I feel like I've hit a point of diminishing returns (in terms of bringing in new people thru ads), and it's just not worth if for me to spend like an entire workday on a Patreon ad.

That being said, the amount y'all support me on here ... is to say the least, nothing to sneeze at!! Which brings me to my next point:

---

2) THANK YOU!! For your support on here. A lot of you seem to be willing to support me even when my activity slows down -- you're absolute angels to do that, and it's something I don't really... expect from an audience? Like, it goes against a lot of conventional wisdom? \ud83d\ude05

Also, y'all don't owe me this at all. I see a lot of explanation and apologies in exit surveys and it's like, no... bro.... sis..... h-honey. You do you. I'm not gonna be mad at you for cancelling lmao, for any reason.

---

3) I'm deathly bored of You Are the Guy. I think I just got too up my own ass with lore in it, and once you get too up your own ass with lore, it is difficult to exit the ass.

It's like you're juggling all of these little plot elements you put into play, and just like with juggling, you have to catch every single one. Whether you throw it back into the air for another spin or not is up to you, but you have to at least catch it. If you don't catch them ... well, it just looks clumsy.

And boy did I throw a lot of balls.

It was supposed to be a simple, goofy little series, and I just had to do it. And so as a result, I'm just having trouble putting pen to paper on that series right now. Realistically, my options are:

1) Chaotic Neutral: Take the reigns of The Guy and try to steer the series in some direction.

2) Lawful Good: Take those reigns and bring it to a clean close.

3) Chaotic Evil: Abandon it.

Lmk what you think.

---

4) Lilith


", - "edited": null, - "embed": {}, - "file": {}, - "id": "76755887", - "published": "Wed, 04 Jan 2023 01:21:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "I'm Back! \u270c\ufe0f + I \"Give Up\" \ud83d\ude2b (Not Really)", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:28:39 GMT", - "attachments": [], - "content": "

The Guy opts for a Secret 5th Option, which turns out to be ...


You consult a gamefaqs guide in the only way you know how, on your 1996 IBM PC 340 on top of a large hardwood table with a kitchen chair pulled up to it.

You're always finding reasons to pulled out that stinky ole 1996 IBM PC 340.


Absolutely shameless.


Oh hell yeah. HELL yeah.


[ Table of Contents ]

~~~ / | | \\ ~~~

Pg. 01 - Table of Contents
Pg. 02 - Intro
Pg. 03 - General Strategy
Pg. 04 - The Tech Tree
Pg. 05 - Walkthrough
--> Pg. 05 - Starting Valley
--> Pg. 06 - Pitch-Black Cavern
--> Pg. 07 - The Mountain
--> Pg. 09 - Shen's House Interlude
--> Pg. 09 - Return to Starting Valley
--> Pg. 10 - Non-Canonical [?] Eden Level

~~~ \\ | | / ~~~

[ Author's Note ]

This guide is note currently complete as I am stuck on Non-Canonical Eden Level.
If anyone knows how to get through this part, please send me a DM or post it in
the thread which I check daily. I got the axe but can't find what I'm supposed
to use it on.


[ The Stonejack's Axe ]

If you turn to the left on the intersection out of the house, you enter an area
called [ Deepwoods ] -- It's actually a pretty straightforward path through this
area and into the valley on the other side. Some people have written that there
is a chance for an enemy to spawn here (\"tall bear, doesn't like sunlight\"),
though I've yet to encounter this enemy personally.

Getting through [ Deepwoods ] will get you to [ Desolate Valley ], where you can
find [ Stonejack's Axe ] lodged into a tree made of stone near the entrance to
the mountains. Don't tech into Sweaty before pulling out this axe, as that makes
pulling it out of the stone tree an Impossible class skillcheck.


Well, now you know about the Stonejack's Axe, I guess!


To ascertain this, we will have to look deep, deep into the darkest recesses of The Guy's mind. I'm not sure you're ready for this.


Okay, he appears to want to dig a hole.


He is in the hole now. It's not very deep. His intentions are unclear.


He made himself a little hovel. He wants to live in a little hovel. It looks like it might even have a fireplace in it? This is what The Guy wants.


With this new wealth of knowledge, will you still go back to your friends? Or is there anything you wish to do beforehand?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75926672", - "published": "Wed, 14 Dec 2022 21:48:41 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guyde", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:29:25 GMT", - "attachments": [], - "content": "

Hello dear patrons,

I wanted to make you an offer. Two comics I will never post, and why I'll never post them, in exchange for unlocking the first 11 updates of EDEN Season 1 ( up to them Truffle & Mia getting the radio ) + the first 11 updates of You Are the Guy ( up to us meeting The Mountain Bastard for the first time ) to the Public setting here.

I was just making a patreon ad and trying to cram as many preview panels into it as I could and got to thinking \"dang, I'm really asking potential patrons to take a plunge here into something they don't know anything about. shouldn't I give them a preview?\"

So, this plan is my attempt to do that! Currently I don't see a reason to make it rolling or anything (with more updates being made free as we go), but I guess I'll take y'all's advice on that.

---

Here are the comics I want to offer on this altar.

I never ended up posting this one, because I was worried it'd be misread, and instead I posted this way more verbose one:

Looking at it now, tbh I would've felt better about posting the first cuz it's got more fun artwork, and because the second one strafes a bit too close to just being boring moralization. The We \u2665\ufe0f Haters cake is funny tho.

Here's another:

I had a nagging feeling in the back of my mind about this one, like \"damn, this seems like such an obvious 3-panel, I wonder why nobody made it yet.\"

Well turns out somebody had.

And in classic form, it was KG Green 10 years ago.

https://gunshowcomic.com/513\u00a0

It's always KC Green 10 Years Ago. Always.

It's not that I had never seen this comic, but I just didn't have it in mind as I was making mine. Somebody replied with KC's and I was like \"aaah shit\" and deleted it just a few min after posting.

---

So here's that. What do you think?

I know I've just handed you a CD \"for free\" and then asked for $5 for it like a hustler in the New York subway, but in this case you are actually free to decline -- if the overwhelming response is \"no, keep it completely locked because that's how it was pitched to us,\" I will respect that.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75710038", - "published": "Fri, 09 Dec 2022 15:25:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "Let's make a deal.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:29:46 GMT", - "attachments": [], - "content": "

The people have spoken.

You now have Double Brain, Time Vision, Wide, and Regeneration. Next time, you'll be able to tech as far as Sweaty or Moon Grab!

Timetosis is at its end. The timelines begin to remerge.

As you float drift the chaos of timespace, you consider all of the choices that have lead to you drifting through the chaos of timespace. Who has been making those choices, you wonder? You? God? A pantheon of approximately 1000 gods all yelling over each other??

That last one's kinda a stretch, but then again, you're more stretched that ever right now. It's like a grandma pinched your cheeks, and that grandma also happened to be a body builder.

We're back in the main timeline.

Small Yoyo is intimidated by the sudden surge in your power.

Small Yoyo flees! You are victorious but gain no XP because, well

Anyway, it looks like you have full run of the place with that critter out of the way.

Using both of your brains, you can vaguely extrapolate where you are right now.

You are, of course, outside of the map, in a zone known as Abyssal Unreality. You can hop back in whenever & wherever you want though.

So what will you do now? Reunite with your friends? Go after Yoyo? Check out that cave, or the unkown area to the left?

Or a secret, fucked up 5th thing?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75580104", - "published": "Tue, 06 Dec 2022 15:07:46 GMT", - "service": "patreon", - "shared_file": false, - "title": "TIMETOSIS: OVER", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:30:30 GMT", - "attachments": [], - "content": "

You spit the above sick lines. Now all that's left it to drop the mic.

There is goes.

Yes. Hell yes.

You say that other thing! But unfortunately you can't drop the mic any harder than it has already been dropped.

Look at it. It is literally clipping into the ground.

Just one more attack should finish this. But what?

You decide to do all of those things

at the same time.

It sounds like this:

The scream is so loud in fact that it emanates out of your current temporary timeline and into the adjacent permanent timeline ...

... where it is heard by the people gathered on the first floor,

It was 26 years ago that Badguy was born, but today, for the very first time in his life, he is compelled to speak.

The Sky is defeated. You once again feel power surging through you.

You gain 2 more XP!

How will you spend it?

You already have Double Brain and Time Vision.

Keep in mind that you can advance from the root too. So for your first one, for example, you could get any of these:

Waddaya want?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75157411", - "published": "Sun, 27 Nov 2022 04:50:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "Rap Battle Against the Sky", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:31:45 GMT", - "attachments": [], - "content": "

The people have spoken.

You now have two brains AND can see the potential consequences of anything you do.

In fact, you're getting a vision from Time right now.

You're not sure what this means.

Wait, hold up, Time is giving you a vision again.

Oh.

You need regeneration to survive on fire. Got it.

Now all that's left to do is fighting the sky. But... how do you even fight the sky? Oh, you got it. Here's an idea.

Hell yes.

Bring it home, chat.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75022239", - "published": "Wed, 23 Nov 2022 16:22:40 GMT", - "service": "patreon", - "shared_file": false, - "title": "Fight the sky.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:32:21 GMT", - "attachments": [], - "content": "

You wavedash just out of the range of his Mountain Buster.

Get baited.

You suddenly feel more powerful... in fact, you gain 2 XP to use on the tech tree.

How will you spend them.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74916213", - "published": "Mon, 21 Nov 2022 04:21:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Wavedash", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:32:50 GMT", - "attachments": [], - "content": "

You go in for a mighty kick.

HE BLOCKED LOW!!! OH MY GOD, HE BLOCKED LOW!!!

This is the first dude who has ever actually blocked your kick.

He's going in for the \ud83d\uddfb Mountain Buster \ud83d\uddfb now. That's about to be half your health bar unless you do something

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74693973", - "published": "Tue, 15 Nov 2022 18:23:08 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick HIM in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:33:09 GMT", - "attachments": [], - "content": "

No shins to speak of, I'm afraid. Only forearms. How do you even defeat an entity with just forearms?

Timetosis isn't permanent, so you better find a way to get more powerful while it lasts. Wait is this before, or after you pushed the Mountain Bastard down the mountain?


After. Clearly after.

What do you want to do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74245334", - "published": "Fri, 04 Nov 2022 23:18:13 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick him in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:33:44 GMT", - "attachments": [], - "content": "

Hey y'all,

Thanks so much for your patience while I did the Halloween event. \ud83d\ude01\ud83d\ude01 As mentioned before, I'm going to take a week off -- I'm hoping to make that next week 11/7-11/13. Before that I want to get done:

[1] gacha distribution (that's happening tonight, so check your inbox soon if you're in that tier!) and

[2] a You Are the Guy update -- That will likely be tomorrow or Friday.

In case you missed the Halloween event, I'll post it right here in it's entirety:

Thank you, as always, for your patronage, and I'll see you in the next post.

It's okay if you're imagining that last face saying that.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74158934", - "published": "Thu, 03 Nov 2022 03:43:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "And I'm back!", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:34:43 GMT", - "attachments": [], - "content": "

Hey y'all

[1] In the interest of pure transparency, I wanted to say that I really need to prioritize that Halloween profile pic thing that I do every year right now. Those take... so much work. \ud83d\ude2d You'd think \"it's just a picture a day, how long could it take,\" but lemme tell ya, I think that every year and every year I'm wrong.

So I'm not saying there 100% WON'T be any Patreon stuff while I'm preparing for and doing that, but there might not be, or if there are they might at least be slower than usual.

[2] After October, at the beginning of November, I was also hoping to take a week break. Over the years that I've been doing comics, tbh, I have had trouble even taking weekends. In part this is my own fault cuz I get very distracted and disorganized. It feels like a massive risk for me to be deliberately gone from online for an entire week, but I want to try it. Maybe it will be healthy.

Thank you for reading! Please enjoy this here gacha roll. :]

\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\u2728\ud83c\udf1f\u2728 ULTRA-RARE SMOL GHOST


\ud83d\udcac This isn't even a real character that has ever shown up. I literally just made this guy up, swear to god.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 RARE SEASON

\ud83d\udcac The youngest season, and their cynical and slightly-goth older sibling.



\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 RARE WACKY ROOMMATES

\ud83d\udcac The other guy from Wacky Roommates, who never really had a name. He had a role though -- the straight main to Jerry's WACKY ANTICS!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "73468219", - "published": "Tue, 18 Oct 2022 18:16:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Patreon Update + A Gacha Roll! \ud83d\udd2e", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:34:49 GMT", - "attachments": [], - "content": "

Now what?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "73194386", - "published": "Wed, 12 Oct 2022 02:43:35 GMT", - "service": "patreon", - "shared_file": false, - "title": "F5 to quicksave.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:35:31 GMT", - "attachments": [], - "content": "

You walk to the end of the level. This IS the end, right? I mean, it must be, look at that massive cave. That's an end-of-the-level cave if I've ever seen one. Probably means a cave level is next and that always sucks.

Also, you're pretty far from Badguy at this point. Look at his tiny location indicator.

There's something a lot closer, and it's approaching fast.

You equip the Foot Scope.

You've still got a bit of time before it gets here. Any other precautions you wanna take?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72942785", - "published": "Thu, 06 Oct 2022 02:23:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "Walk on to the end of the level.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:35:52 GMT", - "attachments": [], - "content": "

You jank yourself into that corner. It's like you're trying to get into the backrooms, you're janking so hard. Holy shit. Badguy looks on in astonishment.

Well, you did it. You're out of bounds now. I'm not sure what you were hoping to accomplish through this, but hey, you are the guy I guess.

Meanwhile, downstairs, Mouse Demigod has totally fallen for your trick, and is drinking the potion! A classic blunder.

His class is being randomized! What will it be?? WHAT WILL IT BE???

Well, that's random numbers for you.

Mouse Paladin makes his way upstairs, but he's pretty harmless now. Hey, wasn't there a purple guy with you? Where is that guy?

(You're up here.)

Oh by the way, Miner Character has arrived at the door. It may be about to get pretty crowded in there.

(Not that you're low on space.)

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72646675", - "published": "Thu, 29 Sep 2022 19:45:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "Clip out of bounds.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:36:21 GMT", - "attachments": [], - "content": "

Tag | (No archive for this one, to save time) [ \ud83d\udcbe\u2728 First 11 Updates Free ] [ You might need to scroll down a bit for them, sorry lol ]

Archive | Tag\u00a0[ \ud83d\udcbe\u2728 First 11 Updates Free ]

Archive | Tag

Post\u00a0

Serious Art 1 | Serious Art 2\u00a0

Meme Comic Remaster 1 | Meme Comic Remaster 2\u00a0

This is available @ the \"NICE + Gacha\" tier!

Explanation

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72467685", - "published": "Sun, 25 Sep 2022 22:28:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "\u2728 Patreon-Exclusive Content Archive \u2728", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:36:41 GMT", - "attachments": [], - "content": "

The ensmallening spell wears off, and you and Badguy burst out of the box and back into that small basement room.

You decide to head upstairs and explore the house. But behind you, you leave the rest of the Class Randomization Potion, with a \"DRINK ME\" label on it.

Around this time, the Mouse Demigod reaches what I've come to call the Shitshow Door.

The mouse has arrived. Let's see what's going on upstairs.

There's something here with you. It knows you're a stranger to this world, and it is not fond of your intrusion. If I were to proceed at all, I'd proceed carefully.

This area feels a bit

whimsical.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72405353", - "published": "Sat, 24 Sep 2022 13:00:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Leave the box.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:37:08 GMT", - "attachments": [], - "content": "

You have hornswoggled him so hard. He is so hornswoggled he doesn't even know what happened, look at how happy he is. He thinks he won.

He drinks his half of the potion.

Uh oh! Turns out it was a Class Randomizing Potion. Badguy is now a ...

Corn Paladin

Meanwhile, Shen has left behind the NOT CANON Sign and resorted to digging.

There are now three characters on their way to your location. Mouse Demigod is the fastest on account of being able to fly. Shen and Miner Character are underground, where Miner Character is obviously faster.

He's like a fish in water down there.

Back to you. You're small, in a box, with a corn paladin.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72310762", - "published": "Thu, 22 Sep 2022 00:38:12 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hornswoggle Badguy", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:37:36 GMT", - "attachments": [], - "content": "

You decide to take over the store, and embark on the noble endeavor of entreprneurshisp.

Badguy asks if he can get a friend discount on the potion.

The fool. There are no friends in entpruetenirship.

Let's check up on Shen.

Wait, 53%? Wasn't he at 79 before? Why is he going backwards??

Oh, he's being pelted by a hail of nails. He's running for his life. The not canon sign is probably broken, huh? The internal electrical components must be all sorts of fucked up now.

Wait, does it even run on electricity?

Did it even ever work at all?

Let's turn the camera to see what's sending these nails.

Badguy really wants that potion.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72205399", - "published": "Mon, 19 Sep 2022 20:08:23 GMT", - "service": "patreon", - "shared_file": false, - "title": "Sell the items. Be the mouse.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:08 GMT", - "attachments": [], - "content": "

You use your thief snatch to steal .... the mouse. Not any of the mouse's ware, but the mouse himself.

The mouse is now in your thiefventory, along with the very concept of weapons.

I'm sure that was nothing.

Anyway, you have full access to all the wares from the mouse shop now. Sweet!

Shen is 79% of the way there with the NOT CANON sign. He's looking pretty tuckered out.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72091429", - "published": "Sat, 17 Sep 2022 13:01:01 GMT", - "service": "patreon", - "shared_file": false, - "title": "Thief skill activate: steal the mouse", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:38 GMT", - "attachments": [], - "content": "

Hey y'all,

I wanna do an ad for the patreon today, and I need some quotes for it.

Like you know how on the back of a book they'll have quotes about how sicknasty the book is? It's like that, but for this. Can you give me some quotes that that I can use in the patreon ad??

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72030404", - "published": "Thu, 15 Sep 2022 19:26:40 GMT", - "service": "patreon", - "shared_file": false, - "title": "What do you think about the Patreon?", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:38 GMT", - "attachments": [], - "content": "

Badguy works some of his mage warlock wizardry and begins to shrink you both.

You're both tiny now.

Badguy climbs into the box too.

All there is in here is a mouse shop. Seems like a mouse is selling some wares.

Now this is a classic mouse shop bullshit. You don't even know what half of this stuff is. Is that just a tiny green pyramid? Why is there a normal-sized nail but a tiny hammer? Is that just straight up a piece of lint?

Classic mouse shop bullshit.

Let's see how Shen's doing.

Shen's 37% of the way there with his NOT CANON sign.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72001916", - "published": "Thu, 15 Sep 2022 13:00:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask Badguy to shrink you both", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:01 GMT", - "attachments": [], - "content": "

You get into one of the boxes. Your body fits in there but unfortunately your head can't quite fit.

Hey.

Hey don't be mad at me for this call. I actually made the boxes bigger for this panel y'know, I scaled them up.

Meanwhile, Shen is running as fast as he can with the Not Canon sign, making his way to your location.

He's tuckered out. Look at this doofus. He's tired.

He's eating a PB&J now.

Meanwhile, Badguy is getting a little jealous that you have a box and he doesn't. And don't even look at this other boxes. Clearly there is only one guy-sized box here.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71756991", - "published": "Sat, 10 Sep 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hide in the boxes.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:18 GMT", - "attachments": [], - "content": "

You apologize to The Bad Guy for kicking him in the shin.

The Bad guy breaks out in tears. Maybe that's all that was needed. Although he did, y'know, try to steal your smile.

You decide to investigate the door together, now as Friends(?).

Oh. Oh no, this isn't even the right adventure.

You really shouldn't be here. Just turn around and walk back out. Please.

Hold on, I'm getting the big \"NOT CANON\" sign.

Don't.

Touch.

Anything.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71677434", - "published": "Thu, 08 Sep 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Apologize for kicking him in the shin", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:33 GMT", - "attachments": [ - { - "name": "title card.png", - "path": "/75/b5/75b5a46f358890238a5c7e35a1cf01cf3483211bb0b91060fc28db67dbe775a6.png" - }, - { - "name": "[ Audio Log ] Patching.mp3", - "path": "/25/22/2522a5246e79041fb5168c804d6f137dd1e4b8ca86a50fa587f8ce1cfe18701c.mp3" - } - ], - "content": "




", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Patching.mp3", - "path": "/25/22/2522a5246e79041fb5168c804d6f137dd1e4b8ca86a50fa587f8ce1cfe18701c.mp3" - }, - "id": "71623437", - "published": "Wed, 07 Sep 2022 00:21:50 GMT", - "service": "patreon", - "shared_file": false, - "title": "23. Patching", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:40:55 GMT", - "attachments": [], - "content": "

Okay! Time to continue this. But how?

You're ... not sure what this has to do with anything.

Okay! Yeah, this is something. I mean, there's an extra guy, but this is something.

Ah! They're falling on a pillow now. Excellent.

But it's on fire. Oh god, everything's on fire.

Okay, you are the guy again. Everything's on fire. The Bad Guy is still tusslin. There's a pillow and a door in the background.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71380943", - "published": "Thu, 01 Sep 2022 19:54:23 GMT", - "service": "patreon", - "shared_file": false, - "title": "You made this one.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:41:38 GMT", - "attachments": [], - "content": "



You devour an entire jar of pickles in the middle of the kitchen floor like a neanderthal.

Or maybe that's not a fair comparison. Has a neanderthal ever, in the history of the world, eaten a pickle? How would that even happen? Could it be that some freak accident in nature once created a single pickle, that a neanderthal then picked up and ate, never to taste that salty, scrumptious goodness again?

You think these thoughts.

Nourishment++

Ideation++


You're pumped up and ready to make this next update.

Okay, let's see here ...

The Guy is suplexing The Bad Guy down a mountain. No wait, this already happened. You need to draw what happens next. New layer! NEW LAYER!

Ah, yes, a new layer. Pristine. Untainted by the sins of your pen, but not for long.

What do you wish to draw?

You can say stuff like \"draw a circle\" or \"draw an eye\" or \"draw some squiggles.\" It's kind of like twitch plays pokemon, I'm just gonna do all of the comments in order (though I may move on to a new layer every 10 or so!)

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71238640", - "published": "Tue, 30 Aug 2022 13:25:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Nourishment.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:01 GMT", - "attachments": [], - "content": "

\u00a0I mean, you could do that.

You feel like it would kinda be cheating though.


NO!! FOILED BY YOURSELF!!!

You go give yourself a middle finger in the mirror.

You're starting to grow a mustache. That never looks good on you. You've never been a mustache guy. Beard? Sure. Sideburns? Great. It's the mustache where it all goes wrong.

Oh well, it's not like you go outside anyway. And nobody can see half your face when you do.

Hm... that update is due pretty soon.

Your meters are kinda in the red, according to your status square.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71182880", - "published": "Mon, 29 Aug 2022 16:04:31 GMT", - "service": "patreon", - "shared_file": false, - "title": "Add your own comment and choose it.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:23 GMT", - "attachments": [], - "content": "

You pop out of the snow behind The Bad guy.

You hug him with all your might ...

And then suplex him off the mountain.

As you fall, it occurs to you that you've been being pretty evil lately.

But that's not your fault. You are merely The Guy, after all. It's not even the commenters' fault. It's the fault of the person picking the comments.

You are now Shen. You're looking at this post, trying to pick the next comment to draw. What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71135747", - "published": "Sun, 28 Aug 2022 13:01:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hug The Bad Guy so he won't be bad", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:45 GMT", - "attachments": [], - "content": "

Before he pulls off his hat, you decide to hide with the speed and effectiveness that only a true rogue can muster.

Flawless.

He has no idea where you are.

You could've stabbed him in the back right now if you hadn't stolen the concept of weapons.

Also I think the sky is trying to snitch on you. You suppose that's what you get for messing with the Mountain Bastard.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71087979", - "published": "Sat, 27 Aug 2022 13:01:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "You're a rogue now, hide.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:43:02 GMT", - "attachments": [ - { - "name": "[ Audio Log ] Demolition.mp3", - "path": "/aa/78/aa788eadacd5955d9e8cf660ee5a8d1efae96eabccb913ec1d7cbb6011308739.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

All roads suddenly converge. The two paths in the wood lead to the same dark house. Both cups of tea are poisoned. And those distinct memories you have in your childhood, of seeing two moons in the sky? You must just have been seeing double.

Because only one story remains, and it's up next:

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Demolition.mp3", - "path": "/aa/78/aa788eadacd5955d9e8cf660ee5a8d1efae96eabccb913ec1d7cbb6011308739.mp3" - }, - "id": "71070581", - "published": "Fri, 26 Aug 2022 16:05:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "22. Demolition", - "user": "72813" - } -] diff --git a/testing/shen_post_api_page_one_first_half.bin b/testing/shen_post_api_page_one_first_half.bin deleted file mode 100644 index 1a05eda..0000000 --- a/testing/shen_post_api_page_one_first_half.bin +++ /dev/null @@ -1,308 +0,0 @@ -[{ - "added": "Fri, 23 Jun 2023 10:29:54 GMT", - "attachments": [], - "content": "










", - "edited": null, - "embed": {}, - "file": {}, - "id": "84905474", - "published": "Wed, 21 Jun 2023 13:19:17 GMT", - "service": "patreon", - "shared_file": false, - "title": "🔮 We look back.", - "user": "72813" -}, -{ - "added": "Fri, 23 Jun 2023 10:30:14 GMT", - "attachments": [], - "content": "
















", - "edited": null, - "embed": {}, - "file": {}, - "id": "84778099", - "published": "Mon, 19 Jun 2023 01:29:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Lilith's Parents (Full Arc So Far)", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:17:59 GMT", - "attachments": [], - "content": "
































", - "edited": null, - "embed": {}, - "file": {}, - "id": "84238287", - "published": "Thu, 08 Jun 2023 00:12:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Lilith Remembers", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:18:59 GMT", - "attachments": [], - "content": "




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83529449", - "published": "Thu, 25 May 2023 12:57:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Your Favorite Girl", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:19:13 GMT", - "attachments": [], - "content": "

 --- ✂ --- ✂ --- ✂ --- 

📰  News 📰

• New Set: LILITH

 --- ✂ --- ✂ --- ✂ --- 


 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Type A & B

💬 Competitive, achievement oriented, perfectionist. That's a Type A personality.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

✨🌟✨ Ultra-Rare Lilith

💬 Some people have asked if this is canon. My response to this is that it is as canon as Nun Ana. Which is to say, it is super not canon. Like super duper not canon.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Plants on a Distant Planet

💬 The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Lilith

💬 An unfortunate girl.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Cultist

💬 The power cthulhu surges through him. It is too late for this world.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Blormbus

💬 Just regular ol' Blormbus. I added a wizard hat because I thought you might be mad if it was literally JUST Blormbus. I mean, you've seen him already. So, that's why he has a wizard hat.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Wacky Roommates

💬 Jerry from the iconic Shen Comix mini-series Wacky Roommates! Oh... you... you don't know what that is? Oh ...



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Blormbus

💬 Don't be alarmed that Blormbus is now red and slightly bigger. We just gave him an apple slice. Look, you can see him dissolving it.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83343026", - "published": "Sun, 21 May 2023 20:52:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "🔮✨🔮✨🔮", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "", - "edited": null, - "embed": {}, - "file": {}, - "id": "83218897", - "published": "Fri, 19 May 2023 02:19:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Lilonth", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83169653", - "published": "Thu, 18 May 2023 02:50:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Lilith gets angry.", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:20:11 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83065295", - "published": "Tue, 16 May 2023 02:09:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club - Lilith's Hair", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:20:25 GMT", - "attachments": [], - "content": "

", - "edited": null, - "embed": {}, - "file": {}, - "id": "82276738", - "published": "Sun, 30 Apr 2023 13:07:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club #24 - Lilith's Parents Pt. 1", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:20:46 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "82064413", - "published": "Wed, 26 Apr 2023 03:40:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club #23 - Art Cubbies Pt. 2", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:21:12 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "81954654", - "published": "Mon, 24 Apr 2023 01:39:19 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #22 - Art Cubbies", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:21:42 GMT", - "attachments": [], - "content": "

( This update is set in the past, when Dorothy sold Leanne the blockchain \"tome\" that Leanne had spent all of Lilith's money on. )




















", - "edited": null, - "embed": {}, - "file": {}, - "id": "81851518", - "published": "Fri, 21 Apr 2023 17:41:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club #20 + #21 - Leanne's Statue", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:22:58 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "81209841", - "published": "Sat, 08 Apr 2023 03:33:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #19 - Repurpose", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:23:24 GMT", - "attachments": [], - "content": "











", - "edited": null, - "embed": {}, - "file": {}, - "id": "81059547", - "published": "Wed, 05 Apr 2023 02:03:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #18: Bofa Begins", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:24:05 GMT", - "attachments": [], - "content": "









~~ 🍋 ~~












", - "edited": null, - "embed": {}, - "file": {}, - "id": "80704628", - "published": "Wed, 29 Mar 2023 05:48:00 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club [#16, #17] 🍋", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:25:12 GMT", - "attachments": [], - "content": "

I'm hoping to start posting these early here soon!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "80338946", - "published": "Tue, 21 Mar 2023 15:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club 🍋 [ #1 - #15 ]", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:26:46 GMT", - "attachments": [], - "content": "

 --- ✂ --- ✂ --- ✂ --- 

Hi Shen Comix Patreon Community! This set of gacha rolls is generated automatically 🤖 but delivered personally. 📨✌( So if you have any comments or questions, I'm here to respond to them! )


📰  News 📰

• New Set: PLANTS ON A DISTANT PLANET

• I know this is a day late, sorry!

 --- ✂ --- ✂ --- ✂ --- 


 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Plants on a Distant Planet

💬 The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Wizard

💬 Maple, an allegedly great and powerful dark wizard able to spawn a tornado of dark energy. Once. Before he gets dizzy.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Little Firefighter

💬 The outfit is snazzier but, let's be real, not much has changed.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "80190808", - "published": "Sat, 18 Mar 2023 06:14:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll!! Again! 🪩🪩", - "user": "72813" -}, -{ - "added": "Fri, 17 Mar 2023 16:28:56 GMT", - "attachments": [], - "content": "

Community Roll. 


--- ✂ --- ✂ --- ✂ --- 

Hi Community! This set of gacha rolls is generated automatically 🤖 but delivered personally. 📨✌( So if you have any comments or questions, I'm here to respond to them! )


📰  News 📰

• New Sets: D&D CHARACTER, WIZARDS

• Updated Art: LITTLE FIREFIGHTER

 --- ✂ --- ✂ --- ✂ --- 


 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare D&D Character

💬 Miligo, a D&D character I play in my friend's campaign. She's a ball of aggression and insecurity who tried to intimidate a book once.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common The Guy

💬 The Guy prior to the rogue transformation. Extremely powerful, but only against ankles, just like my Elden Ring character.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Season

💬 The youngest season, and their cynical and slightly-goth older sibling.


Community roll.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "79994633", - "published": "Tue, 14 Mar 2023 04:26:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll! 🪩", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:26:13 GMT", - "attachments": [], - "content": "



Badguy wonders why the moon is rising.

He has never seen the moon rise during the day like this.


Especially not sideways.


Oh.


You plummet towards Badguy, wielding your newly crafted MOONPICK.


He throws out a slash.



( You're about this close now. )


Another slash.



( You're pretty much there. )


You land powerfully in front of Badguy.


In classic bad guy fashion, Badguy begins smugly monologuing about how your MOONPICK has been rendered useless.


You bonk him on the head with the MOONHAMMER.


Badguy goes down instantly.


You decide that these 2 artifacts are simply too powerful for the hands of humans.


You have to get rid of them. Put them somewhere where they will never be found.


So you give them to Shen, who almost immediately loses them. That dude has a talent for losing things. When he loses something, it might as well be in the void of space.


All according to plan.


Then, finally, you decide to live out a dream you've had for a while.


You build yourself a dirt hovel.


Badguy has built a significantly more impressive one next to yours and is currently pouting in it.


It's okay, you think.

You'll let Badguy have this one.







", - "edited": null, - "embed": {}, - "file": {}, - "id": "78434719", - "published": "Thu, 09 Feb 2023 02:04:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy (Finale Pt. 2)", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:27:34 GMT", - "attachments": [], - "content": "

You arrive at the STONEJACK'S AXE to find that somebody got to it first.


A strong wind billows through the valley, but the stone tree which once held the axe does not sway, and neither does it's new holder ...


Which is BADGUY. Badguy now has the axe. Or maybe it has him.

In any case, you sense a battle brewing.


Luckily, you have that PICKAXE you swiped from MINER CHARACTER.


And you use it to ...


... ⚠️ ESCAPE!! ⚠️


But Badguy is having none of it.


He uses the Stonejack's Axe to slash apart the very air around you


sending you plummeting down!


As you careen towards the earth, you have only one tool, and one option.


You mine. You mine faster and harder than you've ever mined before.

Of course that's not saying much, since you were never much of a miner. The point of reference is 0 here.


But suffice to say, you mine very fast.


In fact, you mine all the way through the planet, to the NIGHTTIME SIDE, where the momentum once again carries you into the sky.


Ah, the moon.

Isn't it beautiful?




", - "edited": null, - "embed": {}, - "file": {}, - "id": "77440488", - "published": "Thu, 19 Jan 2023 04:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy { Finale Pt.1 }", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:28:37 GMT", - "attachments": [], - "content": "

Hey peeps,

Thank you for your patience as I haven't been active on here in the past couple of weeks. I wanted to briefly talk about a few things.

---

1) I give up ON promoting the Patreon as hard as I have been on social media. Mind you, I don't give up on the Patreon itself, just on promoting it that hard.

But I feel like I've hit a point of diminishing returns (in terms of bringing in new people thru ads), and it's just not worth if for me to spend like an entire workday on a Patreon ad.

That being said, the amount y'all support me on here ... is to say the least, nothing to sneeze at!! Which brings me to my next point:

---

2) THANK YOU!! For your support on here. A lot of you seem to be willing to support me even when my activity slows down -- you're absolute angels to do that, and it's something I don't really... expect from an audience? Like, it goes against a lot of conventional wisdom? 😅

Also, y'all don't owe me this at all. I see a lot of explanation and apologies in exit surveys and it's like, no... bro.... sis..... h-honey. You do you. I'm not gonna be mad at you for cancelling lmao, for any reason.

---

3) I'm deathly bored of You Are the Guy. I think I just got too up my own ass with lore in it, and once you get too up your own ass with lore, it is difficult to exit the ass.

It's like you're juggling all of these little plot elements you put into play, and just like with juggling, you have to catch every single one. Whether you throw it back into the air for another spin or not is up to you, but you have to at least catch it. If you don't catch them ... well, it just looks clumsy.

And boy did I throw a lot of balls.

It was supposed to be a simple, goofy little series, and I just had to do it. And so as a result, I'm just having trouble putting pen to paper on that series right now. Realistically, my options are:

1) Chaotic Neutral: Take the reigns of The Guy and try to steer the series in some direction.

2) Lawful Good: Take those reigns and bring it to a clean close.

3) Chaotic Evil: Abandon it.

Lmk what you think.

---

4) Lilith


", - "edited": null, - "embed": {}, - "file": {}, - "id": "76755887", - "published": "Wed, 04 Jan 2023 01:21:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "I'm Back! ✌️ + I \"Give Up\" 😫 (Not Really)", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:28:39 GMT", - "attachments": [], - "content": "

The Guy opts for a Secret 5th Option, which turns out to be ...


You consult a gamefaqs guide in the only way you know how, on your 1996 IBM PC 340 on top of a large hardwood table with a kitchen chair pulled up to it.

You're always finding reasons to pulled out that stinky ole 1996 IBM PC 340.


Absolutely shameless.


Oh hell yeah. HELL yeah.


[ Table of Contents ]

~~~ / | | \\ ~~~

Pg. 01 - Table of Contents
Pg. 02 - Intro
Pg. 03 - General Strategy
Pg. 04 - The Tech Tree
Pg. 05 - Walkthrough
--> Pg. 05 - Starting Valley
--> Pg. 06 - Pitch-Black Cavern
--> Pg. 07 - The Mountain
--> Pg. 09 - Shen's House Interlude
--> Pg. 09 - Return to Starting Valley
--> Pg. 10 - Non-Canonical [?] Eden Level

~~~ \\ | | / ~~~

[ Author's Note ]

This guide is note currently complete as I am stuck on Non-Canonical Eden Level.
If anyone knows how to get through this part, please send me a DM or post it in
the thread which I check daily. I got the axe but can't find what I'm supposed
to use it on.


[ The Stonejack's Axe ]

If you turn to the left on the intersection out of the house, you enter an area
called [ Deepwoods ] -- It's actually a pretty straightforward path through this
area and into the valley on the other side. Some people have written that there
is a chance for an enemy to spawn here (\"tall bear, doesn't like sunlight\"),
though I've yet to encounter this enemy personally.

Getting through [ Deepwoods ] will get you to [ Desolate Valley ], where you can
find [ Stonejack's Axe ] lodged into a tree made of stone near the entrance to
the mountains. Don't tech into Sweaty before pulling out this axe, as that makes
pulling it out of the stone tree an Impossible class skillcheck.


Well, now you know about the Stonejack's Axe, I guess!


To ascertain this, we will have to look deep, deep into the darkest recesses of The Guy's mind. I'm not sure you're ready for this.


Okay, he appears to want to dig a hole.


He is in the hole now. It's not very deep. His intentions are unclear.


He made himself a little hovel. He wants to live in a little hovel. It looks like it might even have a fireplace in it? This is what The Guy wants.


With this new wealth of knowledge, will you still go back to your friends? Or is there anything you wish to do beforehand?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75926672", - "published": "Wed, 14 Dec 2022 21:48:41 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guyde", - "user": "72813" -}] \ No newline at end of file diff --git a/testing/shen_post_api_page_one_first_half.json b/testing/shen_post_api_page_one_first_half.json deleted file mode 100644 index 1a05eda..0000000 --- a/testing/shen_post_api_page_one_first_half.json +++ /dev/null @@ -1,308 +0,0 @@ -[{ - "added": "Fri, 23 Jun 2023 10:29:54 GMT", - "attachments": [], - "content": "










", - "edited": null, - "embed": {}, - "file": {}, - "id": "84905474", - "published": "Wed, 21 Jun 2023 13:19:17 GMT", - "service": "patreon", - "shared_file": false, - "title": "🔮 We look back.", - "user": "72813" -}, -{ - "added": "Fri, 23 Jun 2023 10:30:14 GMT", - "attachments": [], - "content": "
















", - "edited": null, - "embed": {}, - "file": {}, - "id": "84778099", - "published": "Mon, 19 Jun 2023 01:29:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Lilith's Parents (Full Arc So Far)", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:17:59 GMT", - "attachments": [], - "content": "
































", - "edited": null, - "embed": {}, - "file": {}, - "id": "84238287", - "published": "Thu, 08 Jun 2023 00:12:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Lilith Remembers", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:18:59 GMT", - "attachments": [], - "content": "




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83529449", - "published": "Thu, 25 May 2023 12:57:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Your Favorite Girl", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:19:13 GMT", - "attachments": [], - "content": "

 --- ✂ --- ✂ --- ✂ --- 

📰  News 📰

• New Set: LILITH

 --- ✂ --- ✂ --- ✂ --- 


 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Type A & B

💬 Competitive, achievement oriented, perfectionist. That's a Type A personality.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

✨🌟✨ Ultra-Rare Lilith

💬 Some people have asked if this is canon. My response to this is that it is as canon as Nun Ana. Which is to say, it is super not canon. Like super duper not canon.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Plants on a Distant Planet

💬 The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Lilith

💬 An unfortunate girl.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Cultist

💬 The power cthulhu surges through him. It is too late for this world.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Blormbus

💬 Just regular ol' Blormbus. I added a wizard hat because I thought you might be mad if it was literally JUST Blormbus. I mean, you've seen him already. So, that's why he has a wizard hat.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Wacky Roommates

💬 Jerry from the iconic Shen Comix mini-series Wacky Roommates! Oh... you... you don't know what that is? Oh ...



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Blormbus

💬 Don't be alarmed that Blormbus is now red and slightly bigger. We just gave him an apple slice. Look, you can see him dissolving it.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "83343026", - "published": "Sun, 21 May 2023 20:52:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "🔮✨🔮✨🔮", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "", - "edited": null, - "embed": {}, - "file": {}, - "id": "83218897", - "published": "Fri, 19 May 2023 02:19:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Lilonth", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:19:45 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83169653", - "published": "Thu, 18 May 2023 02:50:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Lilith gets angry.", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:20:11 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "83065295", - "published": "Tue, 16 May 2023 02:09:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club - Lilith's Hair", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:20:25 GMT", - "attachments": [], - "content": "

", - "edited": null, - "embed": {}, - "file": {}, - "id": "82276738", - "published": "Sun, 30 Apr 2023 13:07:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club #24 - Lilith's Parents Pt. 1", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:20:46 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "82064413", - "published": "Wed, 26 Apr 2023 03:40:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club #23 - Art Cubbies Pt. 2", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:21:12 GMT", - "attachments": [], - "content": "








", - "edited": null, - "embed": {}, - "file": {}, - "id": "81954654", - "published": "Mon, 24 Apr 2023 01:39:19 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #22 - Art Cubbies", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:21:42 GMT", - "attachments": [], - "content": "

( This update is set in the past, when Dorothy sold Leanne the blockchain \"tome\" that Leanne had spent all of Lilith's money on. )




















", - "edited": null, - "embed": {}, - "file": {}, - "id": "81851518", - "published": "Fri, 21 Apr 2023 17:41:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club #20 + #21 - Leanne's Statue", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:22:58 GMT", - "attachments": [], - "content": "






", - "edited": null, - "embed": {}, - "file": {}, - "id": "81209841", - "published": "Sat, 08 Apr 2023 03:33:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #19 - Repurpose", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:23:24 GMT", - "attachments": [], - "content": "











", - "edited": null, - "embed": {}, - "file": {}, - "id": "81059547", - "published": "Wed, 05 Apr 2023 02:03:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "Public U. Art Club #18: Bofa Begins", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:24:05 GMT", - "attachments": [], - "content": "









~~ 🍋 ~~












", - "edited": null, - "embed": {}, - "file": {}, - "id": "80704628", - "published": "Wed, 29 Mar 2023 05:48:00 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club [#16, #17] 🍋", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:25:12 GMT", - "attachments": [], - "content": "

I'm hoping to start posting these early here soon!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "80338946", - "published": "Tue, 21 Mar 2023 15:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "🍋 Public U. Art Club 🍋 [ #1 - #15 ]", - "user": "72813" -}, -{ - "added": "Thu, 15 Jun 2023 16:26:46 GMT", - "attachments": [], - "content": "

 --- ✂ --- ✂ --- ✂ --- 

Hi Shen Comix Patreon Community! This set of gacha rolls is generated automatically 🤖 but delivered personally. 📨✌( So if you have any comments or questions, I'm here to respond to them! )


📰  News 📰

• New Set: PLANTS ON A DISTANT PLANET

• I know this is a day late, sorry!

 --- ✂ --- ✂ --- ✂ --- 


 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Plants on a Distant Planet

💬 The Gates are actually two plants, which grow upwards and rotate until they meet another of their kind, at which point they fuse into one organism and flower. They can get as tall as skyscrapers. Don't worry though, nothing happens when you pass through one of these 'gates.' Probably.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common Wizard

💬 Maple, an allegedly great and powerful dark wizard able to spawn a tornado of dark energy. Once. Before he gets dizzy.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Little Firefighter

💬 The outfit is snazzier but, let's be real, not much has changed.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "80190808", - "published": "Sat, 18 Mar 2023 06:14:52 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll!! Again! 🪩🪩", - "user": "72813" -}, -{ - "added": "Fri, 17 Mar 2023 16:28:56 GMT", - "attachments": [], - "content": "

Community Roll. 


--- ✂ --- ✂ --- ✂ --- 

Hi Community! This set of gacha rolls is generated automatically 🤖 but delivered personally. 📨✌( So if you have any comments or questions, I'm here to respond to them! )


📰  News 📰

• New Sets: D&D CHARACTER, WIZARDS

• Updated Art: LITTLE FIREFIGHTER

 --- ✂ --- ✂ --- ✂ --- 


 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare D&D Character

💬 Miligo, a D&D character I play in my friend's campaign. She's a ball of aggression and insecurity who tried to intimidate a book once.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

👍 Common The Guy

💬 The Guy prior to the rogue transformation. Extremely powerful, but only against ankles, just like my Elden Ring character.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 Rare Season

💬 The youngest season, and their cynical and slightly-goth older sibling.


Community roll.




", - "edited": null, - "embed": {}, - "file": {}, - "id": "79994633", - "published": "Tue, 14 Mar 2023 04:26:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Community Roll! 🪩", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:26:13 GMT", - "attachments": [], - "content": "



Badguy wonders why the moon is rising.

He has never seen the moon rise during the day like this.


Especially not sideways.


Oh.


You plummet towards Badguy, wielding your newly crafted MOONPICK.


He throws out a slash.



( You're about this close now. )


Another slash.



( You're pretty much there. )


You land powerfully in front of Badguy.


In classic bad guy fashion, Badguy begins smugly monologuing about how your MOONPICK has been rendered useless.


You bonk him on the head with the MOONHAMMER.


Badguy goes down instantly.


You decide that these 2 artifacts are simply too powerful for the hands of humans.


You have to get rid of them. Put them somewhere where they will never be found.


So you give them to Shen, who almost immediately loses them. That dude has a talent for losing things. When he loses something, it might as well be in the void of space.


All according to plan.


Then, finally, you decide to live out a dream you've had for a while.


You build yourself a dirt hovel.


Badguy has built a significantly more impressive one next to yours and is currently pouting in it.


It's okay, you think.

You'll let Badguy have this one.







", - "edited": null, - "embed": {}, - "file": {}, - "id": "78434719", - "published": "Thu, 09 Feb 2023 02:04:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy (Finale Pt. 2)", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:27:34 GMT", - "attachments": [], - "content": "

You arrive at the STONEJACK'S AXE to find that somebody got to it first.


A strong wind billows through the valley, but the stone tree which once held the axe does not sway, and neither does it's new holder ...


Which is BADGUY. Badguy now has the axe. Or maybe it has him.

In any case, you sense a battle brewing.


Luckily, you have that PICKAXE you swiped from MINER CHARACTER.


And you use it to ...


... ⚠️ ESCAPE!! ⚠️


But Badguy is having none of it.


He uses the Stonejack's Axe to slash apart the very air around you


sending you plummeting down!


As you careen towards the earth, you have only one tool, and one option.


You mine. You mine faster and harder than you've ever mined before.

Of course that's not saying much, since you were never much of a miner. The point of reference is 0 here.


But suffice to say, you mine very fast.


In fact, you mine all the way through the planet, to the NIGHTTIME SIDE, where the momentum once again carries you into the sky.


Ah, the moon.

Isn't it beautiful?




", - "edited": null, - "embed": {}, - "file": {}, - "id": "77440488", - "published": "Thu, 19 Jan 2023 04:25:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guy { Finale Pt.1 }", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:28:37 GMT", - "attachments": [], - "content": "

Hey peeps,

Thank you for your patience as I haven't been active on here in the past couple of weeks. I wanted to briefly talk about a few things.

---

1) I give up ON promoting the Patreon as hard as I have been on social media. Mind you, I don't give up on the Patreon itself, just on promoting it that hard.

But I feel like I've hit a point of diminishing returns (in terms of bringing in new people thru ads), and it's just not worth if for me to spend like an entire workday on a Patreon ad.

That being said, the amount y'all support me on here ... is to say the least, nothing to sneeze at!! Which brings me to my next point:

---

2) THANK YOU!! For your support on here. A lot of you seem to be willing to support me even when my activity slows down -- you're absolute angels to do that, and it's something I don't really... expect from an audience? Like, it goes against a lot of conventional wisdom? 😅

Also, y'all don't owe me this at all. I see a lot of explanation and apologies in exit surveys and it's like, no... bro.... sis..... h-honey. You do you. I'm not gonna be mad at you for cancelling lmao, for any reason.

---

3) I'm deathly bored of You Are the Guy. I think I just got too up my own ass with lore in it, and once you get too up your own ass with lore, it is difficult to exit the ass.

It's like you're juggling all of these little plot elements you put into play, and just like with juggling, you have to catch every single one. Whether you throw it back into the air for another spin or not is up to you, but you have to at least catch it. If you don't catch them ... well, it just looks clumsy.

And boy did I throw a lot of balls.

It was supposed to be a simple, goofy little series, and I just had to do it. And so as a result, I'm just having trouble putting pen to paper on that series right now. Realistically, my options are:

1) Chaotic Neutral: Take the reigns of The Guy and try to steer the series in some direction.

2) Lawful Good: Take those reigns and bring it to a clean close.

3) Chaotic Evil: Abandon it.

Lmk what you think.

---

4) Lilith


", - "edited": null, - "embed": {}, - "file": {}, - "id": "76755887", - "published": "Wed, 04 Jan 2023 01:21:56 GMT", - "service": "patreon", - "shared_file": false, - "title": "I'm Back! ✌️ + I \"Give Up\" 😫 (Not Really)", - "user": "72813" -}, -{ - "added": "Mon, 20 Feb 2023 19:28:39 GMT", - "attachments": [], - "content": "

The Guy opts for a Secret 5th Option, which turns out to be ...


You consult a gamefaqs guide in the only way you know how, on your 1996 IBM PC 340 on top of a large hardwood table with a kitchen chair pulled up to it.

You're always finding reasons to pulled out that stinky ole 1996 IBM PC 340.


Absolutely shameless.


Oh hell yeah. HELL yeah.


[ Table of Contents ]

~~~ / | | \\ ~~~

Pg. 01 - Table of Contents
Pg. 02 - Intro
Pg. 03 - General Strategy
Pg. 04 - The Tech Tree
Pg. 05 - Walkthrough
--> Pg. 05 - Starting Valley
--> Pg. 06 - Pitch-Black Cavern
--> Pg. 07 - The Mountain
--> Pg. 09 - Shen's House Interlude
--> Pg. 09 - Return to Starting Valley
--> Pg. 10 - Non-Canonical [?] Eden Level

~~~ \\ | | / ~~~

[ Author's Note ]

This guide is note currently complete as I am stuck on Non-Canonical Eden Level.
If anyone knows how to get through this part, please send me a DM or post it in
the thread which I check daily. I got the axe but can't find what I'm supposed
to use it on.


[ The Stonejack's Axe ]

If you turn to the left on the intersection out of the house, you enter an area
called [ Deepwoods ] -- It's actually a pretty straightforward path through this
area and into the valley on the other side. Some people have written that there
is a chance for an enemy to spawn here (\"tall bear, doesn't like sunlight\"),
though I've yet to encounter this enemy personally.

Getting through [ Deepwoods ] will get you to [ Desolate Valley ], where you can
find [ Stonejack's Axe ] lodged into a tree made of stone near the entrance to
the mountains. Don't tech into Sweaty before pulling out this axe, as that makes
pulling it out of the stone tree an Impossible class skillcheck.


Well, now you know about the Stonejack's Axe, I guess!


To ascertain this, we will have to look deep, deep into the darkest recesses of The Guy's mind. I'm not sure you're ready for this.


Okay, he appears to want to dig a hole.


He is in the hole now. It's not very deep. His intentions are unclear.


He made himself a little hovel. He wants to live in a little hovel. It looks like it might even have a fireplace in it? This is what The Guy wants.


With this new wealth of knowledge, will you still go back to your friends? Or is there anything you wish to do beforehand?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75926672", - "published": "Wed, 14 Dec 2022 21:48:41 GMT", - "service": "patreon", - "shared_file": false, - "title": "You Are the Guyde", - "user": "72813" -}] \ No newline at end of file diff --git a/testing/shen_post_api_page_one_second_half.json b/testing/shen_post_api_page_one_second_half.json deleted file mode 100644 index fa4e862..0000000 --- a/testing/shen_post_api_page_one_second_half.json +++ /dev/null @@ -1,412 +0,0 @@ -[{ - "added": "Mon, 20 Feb 2023 19:29:25 GMT", - "attachments": [], - "content": "

Hello dear patrons,

I wanted to make you an offer. Two comics I will never post, and why I'll never post them, in exchange for unlocking the first 11 updates of EDEN Season 1 ( up to them Truffle & Mia getting the radio ) + the first 11 updates of You Are the Guy ( up to us meeting The Mountain Bastard for the first time ) to the Public setting here.

I was just making a patreon ad and trying to cram as many preview panels into it as I could and got to thinking \"dang, I'm really asking potential patrons to take a plunge here into something they don't know anything about. shouldn't I give them a preview?\"

So, this plan is my attempt to do that! Currently I don't see a reason to make it rolling or anything (with more updates being made free as we go), but I guess I'll take y'all's advice on that.

---

Here are the comics I want to offer on this altar.

I never ended up posting this one, because I was worried it'd be misread, and instead I posted this way more verbose one:

Looking at it now, tbh I would've felt better about posting the first cuz it's got more fun artwork, and because the second one strafes a bit too close to just being boring moralization. The We ♥️ Haters cake is funny tho.

Here's another:

I had a nagging feeling in the back of my mind about this one, like \"damn, this seems like such an obvious 3-panel, I wonder why nobody made it yet.\"

Well turns out somebody had.

And in classic form, it was KG Green 10 years ago.

https://gunshowcomic.com/513 

It's always KC Green 10 Years Ago. Always.

It's not that I had never seen this comic, but I just didn't have it in mind as I was making mine. Somebody replied with KC's and I was like \"aaah shit\" and deleted it just a few min after posting.

---

So here's that. What do you think?

I know I've just handed you a CD \"for free\" and then asked for $5 for it like a hustler in the New York subway, but in this case you are actually free to decline -- if the overwhelming response is \"no, keep it completely locked because that's how it was pitched to us,\" I will respect that.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75710038", - "published": "Fri, 09 Dec 2022 15:25:26 GMT", - "service": "patreon", - "shared_file": false, - "title": "Let's make a deal.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:29:46 GMT", - "attachments": [], - "content": "

The people have spoken.

You now have Double Brain, Time Vision, Wide, and Regeneration. Next time, you'll be able to tech as far as Sweaty or Moon Grab!

Timetosis is at its end. The timelines begin to remerge.

As you float drift the chaos of timespace, you consider all of the choices that have lead to you drifting through the chaos of timespace. Who has been making those choices, you wonder? You? God? A pantheon of approximately 1000 gods all yelling over each other??

That last one's kinda a stretch, but then again, you're more stretched that ever right now. It's like a grandma pinched your cheeks, and that grandma also happened to be a body builder.

We're back in the main timeline.

Small Yoyo is intimidated by the sudden surge in your power.

Small Yoyo flees! You are victorious but gain no XP because, well

Anyway, it looks like you have full run of the place with that critter out of the way.

Using both of your brains, you can vaguely extrapolate where you are right now.

You are, of course, outside of the map, in a zone known as Abyssal Unreality. You can hop back in whenever & wherever you want though.

So what will you do now? Reunite with your friends? Go after Yoyo? Check out that cave, or the unkown area to the left?

Or a secret, fucked up 5th thing?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75580104", - "published": "Tue, 06 Dec 2022 15:07:46 GMT", - "service": "patreon", - "shared_file": false, - "title": "TIMETOSIS: OVER", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:30:30 GMT", - "attachments": [], - "content": "

You spit the above sick lines. Now all that's left it to drop the mic.

There is goes.

Yes. Hell yes.

You say that other thing! But unfortunately you can't drop the mic any harder than it has already been dropped.

Look at it. It is literally clipping into the ground.

Just one more attack should finish this. But what?

You decide to do all of those things

at the same time.

It sounds like this:

The scream is so loud in fact that it emanates out of your current temporary timeline and into the adjacent permanent timeline ...

... where it is heard by the people gathered on the first floor,

It was 26 years ago that Badguy was born, but today, for the very first time in his life, he is compelled to speak.

The Sky is defeated. You once again feel power surging through you.

You gain 2 more XP!

How will you spend it?

You already have Double Brain and Time Vision.

Keep in mind that you can advance from the root too. So for your first one, for example, you could get any of these:

Waddaya want?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75157411", - "published": "Sun, 27 Nov 2022 04:50:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "Rap Battle Against the Sky", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:31:45 GMT", - "attachments": [], - "content": "

The people have spoken.

You now have two brains AND can see the potential consequences of anything you do.

In fact, you're getting a vision from Time right now.

You're not sure what this means.

Wait, hold up, Time is giving you a vision again.

Oh.

You need regeneration to survive on fire. Got it.

Now all that's left to do is fighting the sky. But... how do you even fight the sky? Oh, you got it. Here's an idea.

Hell yes.

Bring it home, chat.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "75022239", - "published": "Wed, 23 Nov 2022 16:22:40 GMT", - "service": "patreon", - "shared_file": false, - "title": "Fight the sky.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:32:21 GMT", - "attachments": [], - "content": "

You wavedash just out of the range of his Mountain Buster.

Get baited.

You suddenly feel more powerful... in fact, you gain 2 XP to use on the tech tree.

How will you spend them.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74916213", - "published": "Mon, 21 Nov 2022 04:21:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Wavedash", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:32:50 GMT", - "attachments": [], - "content": "

You go in for a mighty kick.

HE BLOCKED LOW!!! OH MY GOD, HE BLOCKED LOW!!!

This is the first dude who has ever actually blocked your kick.

He's going in for the 🗻 Mountain Buster 🗻 now. That's about to be half your health bar unless you do something

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74693973", - "published": "Tue, 15 Nov 2022 18:23:08 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick HIM in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:33:09 GMT", - "attachments": [], - "content": "

No shins to speak of, I'm afraid. Only forearms. How do you even defeat an entity with just forearms?

Timetosis isn't permanent, so you better find a way to get more powerful while it lasts. Wait is this before, or after you pushed the Mountain Bastard down the mountain?


After. Clearly after.

What do you want to do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74245334", - "published": "Fri, 04 Nov 2022 23:18:13 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick him in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:33:44 GMT", - "attachments": [], - "content": "

Hey y'all,

Thanks so much for your patience while I did the Halloween event. 😁😁 As mentioned before, I'm going to take a week off -- I'm hoping to make that next week 11/7-11/13. Before that I want to get done:

[1] gacha distribution (that's happening tonight, so check your inbox soon if you're in that tier!) and

[2] a You Are the Guy update -- That will likely be tomorrow or Friday.

In case you missed the Halloween event, I'll post it right here in it's entirety:

Thank you, as always, for your patronage, and I'll see you in the next post.

It's okay if you're imagining that last face saying that.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "74158934", - "published": "Thu, 03 Nov 2022 03:43:49 GMT", - "service": "patreon", - "shared_file": false, - "title": "And I'm back!", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:34:43 GMT", - "attachments": [], - "content": "

Hey y'all

[1] In the interest of pure transparency, I wanted to say that I really need to prioritize that Halloween profile pic thing that I do every year right now. Those take... so much work. 😭 You'd think \"it's just a picture a day, how long could it take,\" but lemme tell ya, I think that every year and every year I'm wrong.

So I'm not saying there 100% WON'T be any Patreon stuff while I'm preparing for and doing that, but there might not be, or if there are they might at least be slower than usual.

[2] After October, at the beginning of November, I was also hoping to take a week break. Over the years that I've been doing comics, tbh, I have had trouble even taking weekends. In part this is my own fault cuz I get very distracted and disorganized. It feels like a massive risk for me to be deliberately gone from online for an entire week, but I want to try it. Maybe it will be healthy.

Thank you for reading! Please enjoy this here gacha roll. :]

 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

✨🌟✨ ULTRA-RARE SMOL GHOST


💬 This isn't even a real character that has ever shown up. I literally just made this guy up, swear to god.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 RARE SEASON

💬 The youngest season, and their cynical and slightly-goth older sibling.



 + +~~~ 🔮 ~~~+ + 

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

🔥 RARE WACKY ROOMMATES

💬 The other guy from Wacky Roommates, who never really had a name. He had a role though -- the straight main to Jerry's WACKY ANTICS!

", - "edited": null, - "embed": {}, - "file": {}, - "id": "73468219", - "published": "Tue, 18 Oct 2022 18:16:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Patreon Update + A Gacha Roll! 🔮", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:34:49 GMT", - "attachments": [], - "content": "

Now what?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "73194386", - "published": "Wed, 12 Oct 2022 02:43:35 GMT", - "service": "patreon", - "shared_file": false, - "title": "F5 to quicksave.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:35:31 GMT", - "attachments": [], - "content": "

You walk to the end of the level. This IS the end, right? I mean, it must be, look at that massive cave. That's an end-of-the-level cave if I've ever seen one. Probably means a cave level is next and that always sucks.

Also, you're pretty far from Badguy at this point. Look at his tiny location indicator.

There's something a lot closer, and it's approaching fast.

You equip the Foot Scope.

You've still got a bit of time before it gets here. Any other precautions you wanna take?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72942785", - "published": "Thu, 06 Oct 2022 02:23:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "Walk on to the end of the level.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:35:52 GMT", - "attachments": [], - "content": "

You jank yourself into that corner. It's like you're trying to get into the backrooms, you're janking so hard. Holy shit. Badguy looks on in astonishment.

Well, you did it. You're out of bounds now. I'm not sure what you were hoping to accomplish through this, but hey, you are the guy I guess.

Meanwhile, downstairs, Mouse Demigod has totally fallen for your trick, and is drinking the potion! A classic blunder.

His class is being randomized! What will it be?? WHAT WILL IT BE???

Well, that's random numbers for you.

Mouse Paladin makes his way upstairs, but he's pretty harmless now. Hey, wasn't there a purple guy with you? Where is that guy?

(You're up here.)

Oh by the way, Miner Character has arrived at the door. It may be about to get pretty crowded in there.

(Not that you're low on space.)

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72646675", - "published": "Thu, 29 Sep 2022 19:45:18 GMT", - "service": "patreon", - "shared_file": false, - "title": "Clip out of bounds.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:36:21 GMT", - "attachments": [], - "content": "

Tag | (No archive for this one, to save time) [ 💾✨ First 11 Updates Free ] [ You might need to scroll down a bit for them, sorry lol ]

Archive | Tag [ 💾✨ First 11 Updates Free ]

Archive | Tag

Post 

Serious Art 1 | Serious Art 2 

Meme Comic Remaster 1 | Meme Comic Remaster 2 

This is available @ the \"NICE + Gacha\" tier!

Explanation

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72467685", - "published": "Sun, 25 Sep 2022 22:28:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "✨ Patreon-Exclusive Content Archive ✨", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:36:41 GMT", - "attachments": [], - "content": "

The ensmallening spell wears off, and you and Badguy burst out of the box and back into that small basement room.

You decide to head upstairs and explore the house. But behind you, you leave the rest of the Class Randomization Potion, with a \"DRINK ME\" label on it.

Around this time, the Mouse Demigod reaches what I've come to call the Shitshow Door.

The mouse has arrived. Let's see what's going on upstairs.

There's something here with you. It knows you're a stranger to this world, and it is not fond of your intrusion. If I were to proceed at all, I'd proceed carefully.

This area feels a bit

whimsical.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72405353", - "published": "Sat, 24 Sep 2022 13:00:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Leave the box.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:37:08 GMT", - "attachments": [], - "content": "

You have hornswoggled him so hard. He is so hornswoggled he doesn't even know what happened, look at how happy he is. He thinks he won.

He drinks his half of the potion.

Uh oh! Turns out it was a Class Randomizing Potion. Badguy is now a ...

Corn Paladin

Meanwhile, Shen has left behind the NOT CANON Sign and resorted to digging.

There are now three characters on their way to your location. Mouse Demigod is the fastest on account of being able to fly. Shen and Miner Character are underground, where Miner Character is obviously faster.

He's like a fish in water down there.

Back to you. You're small, in a box, with a corn paladin.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72310762", - "published": "Thu, 22 Sep 2022 00:38:12 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hornswoggle Badguy", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:37:36 GMT", - "attachments": [], - "content": "

You decide to take over the store, and embark on the noble endeavor of entreprneurshisp.

Badguy asks if he can get a friend discount on the potion.

The fool. There are no friends in entpruetenirship.

Let's check up on Shen.

Wait, 53%? Wasn't he at 79 before? Why is he going backwards??

Oh, he's being pelted by a hail of nails. He's running for his life. The not canon sign is probably broken, huh? The internal electrical components must be all sorts of fucked up now.

Wait, does it even run on electricity?

Did it even ever work at all?

Let's turn the camera to see what's sending these nails.

Badguy really wants that potion.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72205399", - "published": "Mon, 19 Sep 2022 20:08:23 GMT", - "service": "patreon", - "shared_file": false, - "title": "Sell the items. Be the mouse.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:08 GMT", - "attachments": [], - "content": "

You use your thief snatch to steal .... the mouse. Not any of the mouse's ware, but the mouse himself.

The mouse is now in your thiefventory, along with the very concept of weapons.

I'm sure that was nothing.

Anyway, you have full access to all the wares from the mouse shop now. Sweet!

Shen is 79% of the way there with the NOT CANON sign. He's looking pretty tuckered out.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72091429", - "published": "Sat, 17 Sep 2022 13:01:01 GMT", - "service": "patreon", - "shared_file": false, - "title": "Thief skill activate: steal the mouse", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:38 GMT", - "attachments": [], - "content": "

Hey y'all,

I wanna do an ad for the patreon today, and I need some quotes for it.

Like you know how on the back of a book they'll have quotes about how sicknasty the book is? It's like that, but for this. Can you give me some quotes that that I can use in the patreon ad??

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72030404", - "published": "Thu, 15 Sep 2022 19:26:40 GMT", - "service": "patreon", - "shared_file": false, - "title": "What do you think about the Patreon?", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:38:38 GMT", - "attachments": [], - "content": "

Badguy works some of his mage warlock wizardry and begins to shrink you both.

You're both tiny now.

Badguy climbs into the box too.

All there is in here is a mouse shop. Seems like a mouse is selling some wares.

Now this is a classic mouse shop bullshit. You don't even know what half of this stuff is. Is that just a tiny green pyramid? Why is there a normal-sized nail but a tiny hammer? Is that just straight up a piece of lint?

Classic mouse shop bullshit.

Let's see how Shen's doing.

Shen's 37% of the way there with his NOT CANON sign.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "72001916", - "published": "Thu, 15 Sep 2022 13:00:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask Badguy to shrink you both", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:01 GMT", - "attachments": [], - "content": "

You get into one of the boxes. Your body fits in there but unfortunately your head can't quite fit.

Hey.

Hey don't be mad at me for this call. I actually made the boxes bigger for this panel y'know, I scaled them up.

Meanwhile, Shen is running as fast as he can with the Not Canon sign, making his way to your location.

He's tuckered out. Look at this doofus. He's tired.

He's eating a PB&J now.

Meanwhile, Badguy is getting a little jealous that you have a box and he doesn't. And don't even look at this other boxes. Clearly there is only one guy-sized box here.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71756991", - "published": "Sat, 10 Sep 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hide in the boxes.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:18 GMT", - "attachments": [], - "content": "

You apologize to The Bad Guy for kicking him in the shin.

The Bad guy breaks out in tears. Maybe that's all that was needed. Although he did, y'know, try to steal your smile.

You decide to investigate the door together, now as Friends(?).

Oh. Oh no, this isn't even the right adventure.

You really shouldn't be here. Just turn around and walk back out. Please.

Hold on, I'm getting the big \"NOT CANON\" sign.

Don't.

Touch.

Anything.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71677434", - "published": "Thu, 08 Sep 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Apologize for kicking him in the shin", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:39:33 GMT", - "attachments": [ - { - "name": "title card.png", - "path": "/75/b5/75b5a46f358890238a5c7e35a1cf01cf3483211bb0b91060fc28db67dbe775a6.png" - }, - { - "name": "[ Audio Log ] Patching.mp3", - "path": "/25/22/2522a5246e79041fb5168c804d6f137dd1e4b8ca86a50fa587f8ce1cfe18701c.mp3" - } - ], - "content": "




", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Patching.mp3", - "path": "/25/22/2522a5246e79041fb5168c804d6f137dd1e4b8ca86a50fa587f8ce1cfe18701c.mp3" - }, - "id": "71623437", - "published": "Wed, 07 Sep 2022 00:21:50 GMT", - "service": "patreon", - "shared_file": false, - "title": "23. Patching", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:40:55 GMT", - "attachments": [], - "content": "

Okay! Time to continue this. But how?

You're ... not sure what this has to do with anything.

Okay! Yeah, this is something. I mean, there's an extra guy, but this is something.

Ah! They're falling on a pillow now. Excellent.

But it's on fire. Oh god, everything's on fire.

Okay, you are the guy again. Everything's on fire. The Bad Guy is still tusslin. There's a pillow and a door in the background.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71380943", - "published": "Thu, 01 Sep 2022 19:54:23 GMT", - "service": "patreon", - "shared_file": false, - "title": "You made this one.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:41:38 GMT", - "attachments": [], - "content": "



You devour an entire jar of pickles in the middle of the kitchen floor like a neanderthal.

Or maybe that's not a fair comparison. Has a neanderthal ever, in the history of the world, eaten a pickle? How would that even happen? Could it be that some freak accident in nature once created a single pickle, that a neanderthal then picked up and ate, never to taste that salty, scrumptious goodness again?

You think these thoughts.

Nourishment++

Ideation++


You're pumped up and ready to make this next update.

Okay, let's see here ...

The Guy is suplexing The Bad Guy down a mountain. No wait, this already happened. You need to draw what happens next. New layer! NEW LAYER!

Ah, yes, a new layer. Pristine. Untainted by the sins of your pen, but not for long.

What do you wish to draw?

You can say stuff like \"draw a circle\" or \"draw an eye\" or \"draw some squiggles.\" It's kind of like twitch plays pokemon, I'm just gonna do all of the comments in order (though I may move on to a new layer every 10 or so!)

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71238640", - "published": "Tue, 30 Aug 2022 13:25:29 GMT", - "service": "patreon", - "shared_file": false, - "title": "Nourishment.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:01 GMT", - "attachments": [], - "content": "

 I mean, you could do that.

You feel like it would kinda be cheating though.


NO!! FOILED BY YOURSELF!!!

You go give yourself a middle finger in the mirror.

You're starting to grow a mustache. That never looks good on you. You've never been a mustache guy. Beard? Sure. Sideburns? Great. It's the mustache where it all goes wrong.

Oh well, it's not like you go outside anyway. And nobody can see half your face when you do.

Hm... that update is due pretty soon.

Your meters are kinda in the red, according to your status square.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71182880", - "published": "Mon, 29 Aug 2022 16:04:31 GMT", - "service": "patreon", - "shared_file": false, - "title": "Add your own comment and choose it.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:23 GMT", - "attachments": [], - "content": "

You pop out of the snow behind The Bad guy.

You hug him with all your might ...

And then suplex him off the mountain.

As you fall, it occurs to you that you've been being pretty evil lately.

But that's not your fault. You are merely The Guy, after all. It's not even the commenters' fault. It's the fault of the person picking the comments.

You are now Shen. You're looking at this post, trying to pick the next comment to draw. What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71135747", - "published": "Sun, 28 Aug 2022 13:01:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "Hug The Bad Guy so he won't be bad", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:42:45 GMT", - "attachments": [], - "content": "

Before he pulls off his hat, you decide to hide with the speed and effectiveness that only a true rogue can muster.

Flawless.

He has no idea where you are.

You could've stabbed him in the back right now if you hadn't stolen the concept of weapons.

Also I think the sky is trying to snitch on you. You suppose that's what you get for messing with the Mountain Bastard.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71087979", - "published": "Sat, 27 Aug 2022 13:01:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "You're a rogue now, hide.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:43:02 GMT", - "attachments": [ - { - "name": "[ Audio Log ] Demolition.mp3", - "path": "/aa/78/aa788eadacd5955d9e8cf660ee5a8d1efae96eabccb913ec1d7cbb6011308739.mp3" - } - ], - "content": "

< PREV | ▤ ARCHIVE | NEXT >

All roads suddenly converge. The two paths in the wood lead to the same dark house. Both cups of tea are poisoned. And those distinct memories you have in your childhood, of seeing two moons in the sky? You must just have been seeing double.

Because only one story remains, and it's up next:

< PREV | ▤ ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Demolition.mp3", - "path": "/aa/78/aa788eadacd5955d9e8cf660ee5a8d1efae96eabccb913ec1d7cbb6011308739.mp3" - }, - "id": "71070581", - "published": "Fri, 26 Aug 2022 16:05:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "22. Demolition", - "user": "72813" - }] \ No newline at end of file diff --git a/testing/shen_post_api_page_two.bin b/testing/shen_post_api_page_two.bin deleted file mode 100644 index 2625aed..0000000 --- a/testing/shen_post_api_page_two.bin +++ /dev/null @@ -1,1054 +0,0 @@ -[ - { - "added": "Mon, 20 Feb 2023 19:44:54 GMT", - "attachments": [], - "content": "

You inform The Bad Guy that magic isn't real.

Wow. You've broken his innocent, childlike belief in magic.

How could you do this.

You monster.

You also pull his hat down over his face for good measure.

This causes him to get so angry that, despite having lost his innocent, childlike belief in magic, he develops an rational, adult belief in magic.

He starts blasting off fireballs every which way.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71062351", - "published": "Fri, 26 Aug 2022 13:00:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "Remind him that magic doesn't exist", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:45:14 GMT", - "attachments": [], - "content": "

You attempt to push the Mountain Bastard back down the slope.

But your plan is thwarted by The Bad Guy, who just arrived and catches him.

The Bad Guy then remembers that he's the bad guy and throws the Mountain Bastard down the slope, thereby unthwarting your plan.

Realizing that he can no longer use weapons, The Bad Guy changes his class to Mage.

You're thinking this might be a boss battle.

Oh yeah. Yep. It just started snowing. This is definitely a boss battle.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70996043", - "published": "Thu, 25 Aug 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Push Mountain Bastard back down the slope", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:45:34 GMT", - "attachments": [], - "content": "

What is your wisdom, Mountain Bastard?

\"My whole life I've been ascending this mountain. I've walked through snowstorms where I couldn't even see 6 feet in front of me. I've gotten caught in avalanches. Sometimes I slid backwards without even noticing. After all that, I'm still not sure if this is the peak.\"

\"But right now, I've stopped to appreciate this view. Even to you, this is a nice view, no doubt. But you've simply flown up here. To you, this is like reading the ending of a good book that you haven't read. You can tell the book was good, but don't quite have the context to find the ending beautiful.

But to me, who has read the book?

Who, hell, as LEARNED to read just to read this book?\"

\"This view is glorious.\"

Thank you for your wisdom, Mountain Bastard.

What next?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70943219", - "published": "Wed, 24 Aug 2022 13:01:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask for the Mountain Bastard's wisdom.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:45:55 GMT", - "attachments": [], - "content": "

You pickpocket the universe, grabbing the entire \"weapon\" item class.

Technically, Miner Character has a pick, which is a tool.

The Bad Guy has a stalactite (or stalagmite), which is a rock formation.

They get to keep them, but can no longer use them as weapons.

The Bad Guy resolves to hurt you emotionally instead of physically.

Your knife can now only be used for cooking.

You fly up to the top of the mountain.

The Sky is here.

But so is The Mountain Bastard.

What will you do now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70897713", - "published": "Tue, 23 Aug 2022 13:00:06 GMT", - "service": "patreon", - "shared_file": false, - "title": "Steal the concept of weapons", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:46:22 GMT", - "attachments": [], - "content": "

The butterfly lands on your back in an effort to catch you.

You're not sure why you thought a butterfly could lift an entire person.

Actually nevermind, you were right and a genius.

Wow. This has truly become a homestuck.

The Bad Guy and Miner Character are both pissed at you now. Miner Character seems to be able to break through stone quite easily. The Bad Guy is now wielding a stalagmite, or possibly a stalactite, as a weapon. You're not sure how strong that guy is even hypothetically.

I eagerly await what you do next.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70853491", - "published": "Mon, 22 Aug 2022 13:01:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask the butterfly to catch you", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:46:43 GMT", - "attachments": [], - "content": "

You mine a block under him. Unfortunately there's just another solid block there, so all you've done is make him shorter. I get what you were going for though, it would've been funny.

The miner character punches you in the shin.

You are now careening through the air. You're on collision course with the butterfly, and behind the butterfly is a cliff. You cartoonishly left the pickaxe in the air, but you still have the knife.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70808920", - "published": "Sun, 21 Aug 2022 13:00:06 GMT", - "service": "patreon", - "shared_file": false, - "title": "Mine the blocks under him", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:47:06 GMT", - "attachments": [], - "content": "

You pickpocket randomly in the darkness.

You've pocketed a PICK!

The miner you just stole it from turns on his headlamp.

\"Hey, what gives, asshole?? Give me my pick back!\"

He seems pretty miffed about this whole situation. If you don't give him his pick back, there might be a tussle. But then again, maybe you can get past him somehow.

After all, he is just

just a

miner character.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70769224", - "published": "Sat, 20 Aug 2022 13:00:06 GMT", - "service": "patreon", - "shared_file": false, - "title": "Use pickpocket skill", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:47:20 GMT", - "attachments": [ - { - "name": "1500 02.png", - "path": "/46/33/46331de7756705278b612cc3f1f355bc580374a00555a4d27e80da471b797506.png" - }, - { - "name": "[ Audio Log ] A Well Full of Marbles.mp3", - "path": "/3a/88/3a88c586767d9aadb458af5e7c8ddede66ce8ced338d51c4da3fd2db904fb297.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Oh were you expecting a CHOICE here??

Not today buddy. We've only got 2 stories left so it's time for the RAILROAD.

We're gonna start off with Demolition, a story about what happens when you demolish a haunted house. Then we'll do Patching, a story about artificial intelligence.

Patching is the one I want to do last, so that leaves on Demolition for 2nd-to-last, but Demolition is also quite good imo. See you there!

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] A Well Full of Marbles.mp3", - "path": "/3a/88/3a88c586767d9aadb458af5e7c8ddede66ce8ced338d51c4da3fd2db904fb297.mp3" - }, - "id": "70745940", - "published": "Fri, 19 Aug 2022 15:59:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "21. A Well Full of Marbles", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:48:55 GMT", - "attachments": [], - "content": "

You change your class to Thief.

You now have +5 to health and can slither into any opening. Including this one!

To really seal the deal though, you decide to think some evil thoughts, like your nemesis, The Bad Guy would do.

Frankly, you never want to visit those dark recesses of your mind. You enter the hole.

Damn, it is dark in here. Holy shit.

You do like 10 immaculately animated backflips and a hyper-detailed magical girl transformation. This happens, I swear. You also draw a really sick-looking mech, but then destroy the drawing, and also change back to your normal clothes. Too bad this is all in the dark.

What do you want to do now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70716118", - "published": "Fri, 19 Aug 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Change classes to thief.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:49:25 GMT", - "attachments": [], - "content": "

Hey!

Been a while since the last news update. As a thank you for reading this, I included a gacha roll at the end.\u00a0

---

New Patrons - Can I do a thank you thing??

Hey, patrons that joined this week, would you be okay with me using your names in a \"thank you new patrons!\" thing at the end of my next patreon comic? I'm asking to see how people feel about it in general, as I know some of you use your real names on here, and don't wanna violate anyone's privacy. \u270c\ufe0f Maybe like first names only? Does anyone know what the etiquette is on this?

---

Catalogue of Increasingly Normal Stories - RIP

I do unfortunately have to start bringing Catalogue of Increasingly Normal Stories (or \"increasingly normal\", as I've been tagging it) to a close. It was probably the biggest + most organized non-just-random-comics project I've ever done, and I'm quite proud of it actually.

Buuut it is also immensely stressful for me. These past few weeks, I've been obliterating myself trying to get those done. Not to mention, the numbers look grimmer than the stories themselves. \ud83d\ude05 I think I'm always gonna wanna do weird, longer-form, creepy stories, but it seems like maybe this forced approach just isn't working for me or for many of you readers.

SHOUT OUT TO THE PEOPLE THAT LIKE THEM THOUGH! I see you.

After the two upcoming ones that I already have slated, I'm gonna finish it off with a bang with one of I think the best stories I've ever written.

---

And lastly, the ...

\ud83d\udd2e Gacha Roll! \ud83d\udd2e

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d COMMON WACKY ROOMMATES

\ud83d\udcac Jerry from the iconic Shen Comix mini-series Wacky Roommates! Oh... you... you don't know what that is? Oh ...


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\u2728\ud83c\udf1f\u2728 ULTRA-RARE MEME COMIC

\ud83d\udcac The original iteration of this comic wasn't quite satisfying to me. So I remade it! Check it out: https://i.ibb.co/tH7LfpS/page.png\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 RARE J SKELETON

\ud83d\udcac J Skeleton dabbles in acting, and dreams of someday playing a role that isn't a villain.

---

Wowza, what a roll?? This was fair and square, the first one that popped up. If you have any questions about anything, I'll be perusing the comments to answer them. Thx for reading! \ud83d\udc4b

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70668831", - "published": "Thu, 18 Aug 2022 21:01:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "News + A Gacha Roll", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:49:35 GMT", - "attachments": [], - "content": "

You arrive at the site of impact to find the knife, as well as a hole where The Bad Guy hit the rock wall, perfectly in the shape of his body.

Too bad it is not in the shape of your body. If this hole was shaped like you, you could go through it. But instead it is in the shape of your dastardly nemesis, The Bad Guy.

Dang it.

Darn, even.

Anyway, you have the dagger now. It's pretty sick. Possibly cursed and/or haunted.

You look back at the butterfly for approval.

Wow. There you have it.

You're not sure if this butterfly is a good influence on you or not.

What do you want to do next?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70668428", - "published": "Thu, 18 Aug 2022 13:00:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "Retrieve the knife.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:02 GMT", - "attachments": [], - "content": "

You catch The Bad Guy by surprise with a well-placed shin kick,

Do you wanna follow that up or?

I mean, no pressure. He's probably defeated. You can do other stuff if you want.

So, what do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70661972", - "published": "Wed, 17 Aug 2022 20:27:53 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick him in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:15 GMT", - "attachments": [], - "content": "

You walk to the right.

There you find your nemesis, The Bad Guy.

He's just like you, but evil.

You can tell by the expression of sheer malice on his face.

And also by the fact that he has a knife.

The Bad Guy brandishes the knife at you. This is like a mugging, except what he wants is not your money, but your joy. He wants to steal your smile.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70605413", - "published": "Wed, 17 Aug 2022 13:00:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Walk to the right.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:34 GMT", - "attachments": [], - "content": "

You lay down and contemplate the sky.

The sky contemplates you back.

You contemplate harder.

The sky contemplates even harder.

The sky has been just up there for thousands of years, contemplating the shit out of people. This is the final boss of contemplation you're dealing with here. What were you thinking? You should have challenged maybe a rock or a tree first.

Basically, you don't think you're gonna win this one.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70568003", - "published": "Tue, 16 Aug 2022 13:00:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Contemplate the sky.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:51 GMT", - "attachments": [], - "content": "

You can do a little dance, but it will not be a happy one.

You perform a sorrowful interpretive arrangement. It speaks of suffering. It speaks of the human condition.

A nearby butterfly is brought to tears.

Now what?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70527415", - "published": "Mon, 15 Aug 2022 13:01:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Do a little happy dance.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:51:04 GMT", - "attachments": [], - "content": "

You are in the place.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70526592", - "published": "Mon, 15 Aug 2022 00:24:28 GMT", - "service": "patreon", - "shared_file": false, - "title": "You are the guy.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:51:07 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/f4/58/f45873ce41cb60b505fa9fd8c2ea4850897815d485d084cdaa33d06c603c7c8c.png" - }, - { - "name": "[ Audio Log ] Hell.mp3", - "path": "/9e/c3/9ec3bc6b759f34b73ae8eaba377dcfbe06f217e12ce2dbcf9eec329d5a2be43e.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >













2 orbs appears before you. One is so small that you could fit it in the palm of your hand. The other is so large that it could crush you.

Which will it be?

The marble, or the wrecking ball?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Hell.mp3", - "path": "/9e/c3/9ec3bc6b759f34b73ae8eaba377dcfbe06f217e12ce2dbcf9eec329d5a2be43e.mp3" - }, - "id": "70489194", - "published": "Sun, 14 Aug 2022 01:33:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "20. Hell", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:52:32 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/d7/6a/d76afcc5eb98af3b2d07e13cf944eec3bb22a45ad75d3cecd53f34b93e4d4260.png" - }, - { - "name": "[ Audio Log ] Reach.mp3", - "path": "/59/34/593472993f57f3a9383a2dcc905895c8c4bd9a325108a065e278da15ffa9c53b.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >\u00a0


You're up on a mountain, and a severe blizzard has separated you from your fellow climber. Through the snow, you just just barely make out a figure ... no, wait. There are two figures. One of them must be him. Which do you approach?

A Well Full of Marbles or Hell?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Reach.mp3", - "path": "/59/34/593472993f57f3a9383a2dcc905895c8c4bd9a325108a065e278da15ffa9c53b.mp3" - }, - "id": "70114372", - "published": "Fri, 05 Aug 2022 18:01:54 GMT", - "service": "patreon", - "shared_file": false, - "title": "19. Reach", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:53:31 GMT", - "attachments": [ - { - "name": "face.png", - "path": "/d7/74/d774881f8cea7db4c830f3dc9a15c2c3fac20b78bb6cbe312d42b53330fe9b6d.png" - } - ], - "content": "

This is a face for you only. Nobody outside of here even knows that I drew this face. You are among the select few who, as a result of the particular conditions of your life that have led you here, know about it.

There are a billion different timelines in which you made different choices and never ended up seeing this face.

But you are in this one.

What am I to say.

What am I to say except congratulations.

", - "edited": null, - "embed": {}, - "file": { - "name": "face.png", - "path": "/d7/74/d774881f8cea7db4c830f3dc9a15c2c3fac20b78bb6cbe312d42b53330fe9b6d.png" - }, - "id": "69844726", - "published": "Sun, 31 Jul 2022 17:29:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "Patreon-Exclusive Face", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:53:41 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/64/1e/641ed34a42a894de9eba257629be2e98eafdfdeef81e21cc90bd74bfdec62daf.png" - }, - { - "name": "[ Audio Log ] Upside Down Cloud.mp3", - "path": "/c3/0f/c30fcd6964f3e3fa4192947fce8b67a0a57406725f78100177006e6cba31100f.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >\u00a0







Two roads diverge ahead of you.

But then they converge again.

But then they diverge again.

What will it be? Reach or A Well Full of Marbles?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Upside Down Cloud.mp3", - "path": "/c3/0f/c30fcd6964f3e3fa4192947fce8b67a0a57406725f78100177006e6cba31100f.mp3" - }, - "id": "69806320", - "published": "Sat, 30 Jul 2022 20:24:13 GMT", - "service": "patreon", - "shared_file": false, - "title": "18. The Upside Down Cloud", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:54:41 GMT", - "attachments": [ - { - "name": "titlecard.png", - "path": "/a0/52/a05268e7458a1498a7a36d67ab723f468c74cc180b3a92991f9ee82bfafdd27d.png" - }, - { - "name": "[ Audio Log ] The Clause.mp3", - "path": "/87/49/87490fd9aa568042f78f3845d6f8edd0bc8531c548fb27b33b9df2918bae827a.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >









You're feeling around in the dark. You feel two switches on the wall. One of them, you remember, is the light switch, but the other one is the room wide blender. Which do you hit?

Upside Down Cloud or Reach?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Clause.mp3", - "path": "/87/49/87490fd9aa568042f78f3845d6f8edd0bc8531c548fb27b33b9df2918bae827a.mp3" - }, - "id": "69437650", - "published": "Fri, 22 Jul 2022 18:25:11 GMT", - "service": "patreon", - "shared_file": false, - "title": "17. The Clause", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:55:31 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/04/f0/04f017f9fb7a49a142e93ce964cc5a2fc750f67e462fe72bffc77b31e3091f40.png" - }, - { - "name": "[ Audio Log ] The Memory Pawn Shop.mp3", - "path": "/4d/2c/4d2cdd65a37c29ae6cc80a725025c377810b52bd81d4d9760abed1b831c7f022.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >\u00a0


You're almost done with your ritual, but close the book by accident. Aw shit. You don't have much time. Which page was it on again?

The Clause of Upside Down Cloud?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Memory Pawn Shop.mp3", - "path": "/4d/2c/4d2cdd65a37c29ae6cc80a725025c377810b52bd81d4d9760abed1b831c7f022.mp3" - }, - "id": "69267254", - "published": "Mon, 18 Jul 2022 22:41:37 GMT", - "service": "patreon", - "shared_file": false, - "title": "16. The Memory Pawn Shop", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:56:03 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/46/f6/46f6e2ef387e15096ed337eb5beeda13ef4000322f1cf863b8f1cbc80ed407ca.png" - }, - { - "name": "[ Audio Log ] Flavored Water.mp3", - "path": "/21/12/211243db7367582e02ce50615a01d5da264eb5da676e39742fe4405c140dde59.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

You tried to launch fortnite, but didn't read the icon careful, and accidentally launched ...

HAUNTED FORTNITE.

Where are you dropping?

The Memory Pawn Shop or The Clause?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Flavored Water.mp3", - "path": "/21/12/211243db7367582e02ce50615a01d5da264eb5da676e39742fe4405c140dde59.mp3" - }, - "id": "68972303", - "published": "Tue, 12 Jul 2022 01:09:33 GMT", - "service": "patreon", - "shared_file": false, - "title": "15. Flavored Water", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:56:44 GMT", - "attachments": [ - { - "name": "02.png", - "path": "/2a/80/2a808d30306df8f86889836214caec3aa5000c42308d3592c687d7c21f3fa9fd.png" - }, - { - "name": "[ Audio Log ] Shen Comix Minicast.mp3", - "path": "/e6/1f/e61f1bf98c63540a9e2cd10cad8dab221d2a2aab85154ead0c47d06be2a442b3.mp3" - } - ], - "content": "

Old Avatar

New Avatar

Old Logo

New Logo

Old Scary Stories/Comics Logo

New Scary Stories/Comics Logo (Probably most WIP of the bunch)

Also, something I forgot to mention in the audio log: If you're one of those people who forgot they left their subscription on, keep in mind it charges on the first of the month! Which is the day after tomorrow, 07/01.

So, as much as I will happily gobble up your dollars, don't forget to cancel it if you mean to, and if you do forget and are reading this like a week later, feel free to DM me & I can refund it, it's actually pretty easy on here. \ud83d\udc4d

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Shen Comix Minicast.mp3", - "path": "/e6/1f/e61f1bf98c63540a9e2cd10cad8dab221d2a2aab85154ead0c47d06be2a442b3.mp3" - }, - "id": "68433820", - "published": "Wed, 29 Jun 2022 23:03:08 GMT", - "service": "patreon", - "shared_file": false, - "title": "Redesign + The Patreon + L + Ratio", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:57:26 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/6d/be/6dbecdc5dc62f57b5353ca49a675b6ec8d3306af1206d676d2f07d40a713e9dc.png" - }, - { - "name": "[ Audio Log ] Missing Buildings.mp3", - "path": "/b6/18/b61899fc66b0f3bbbc3fa74fa795ca647068eed7b14532e6a224865bceb99b09.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

The cave entrance is collapsing, and you only have time to grab one flashlight. The problem is, you brought 2 duds -- only one of them works. Which one was the working one again?

Flavored Water, The Memory Pawn Shop, or The Clause?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Missing Buildings.mp3", - "path": "/b6/18/b61899fc66b0f3bbbc3fa74fa795ca647068eed7b14532e6a224865bceb99b09.mp3" - }, - "id": "68341058", - "published": "Mon, 27 Jun 2022 23:43:43 GMT", - "service": "patreon", - "shared_file": false, - "title": "14. Missing Buildings", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:58:12 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/99/ae/99ae0ef587e4acccb9e4987857c23a9b45e725bf2f231d88ecc08fce039b074d.png" - }, - { - "name": "[ Audio Log ] The Surgery.mp3", - "path": "/ed/f3/edf30a2898bb6a2cb16e8e3e87b4f75c43bdf62ef08f6325ef8afc18b612795f.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

You never should have gone on this satellite repair mission. As you look back down, you see not 1 Earth, but 3 Earths, all orbiting each other chaotically. Which ... one did you launch from again?

Flavored Water, Missing Buildings, or The Memory Pawn Shop?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Surgery.mp3", - "path": "/ed/f3/edf30a2898bb6a2cb16e8e3e87b4f75c43bdf62ef08f6325ef8afc18b612795f.mp3" - }, - "id": "68202290", - "published": "Fri, 24 Jun 2022 17:26:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "13. The Surgery", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:58:54 GMT", - "attachments": [ - { - "name": "1500 03.png", - "path": "/97/39/9739455f889528f42493e1c3b13dfcf78e47c8e52c9b9debc404fd90fb950417.png" - }, - { - "name": "[ Audio Log ] POV You're a File.mp3", - "path": "/3f/2f/3f2fcca58e489e04ac3ff8dc4dce1a35bdbc8349c6b65f4d24eb4574b1ea9dba.mp3" - } - ], - "content": "


", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] POV You're a File.mp3", - "path": "/3f/2f/3f2fcca58e489e04ac3ff8dc4dce1a35bdbc8349c6b65f4d24eb4574b1ea9dba.mp3" - }, - "id": "68113175", - "published": "Wed, 22 Jun 2022 18:12:53 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Detour ] POV: You're a File You Made as a Kid", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:59:18 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/a1/3e/a13efa577d526a1aa274173394c97b1ce89f84e7d1bf7eacb5dccdb62f71aa57.png" - }, - { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/bb/7b/bb7bce2103ac8ed1224ffbb0c6ddf3c78b311a1c0bac521a82cad42219a4900e.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


You never should've tried to summon a demon -- you used the wrong number of candles, and summoned 3 instead of 1. Luckily, only one of them can manifest, for now at least. Up to you to decide which. So?

Will it be The Surgery, Flavored Water, or Missing Buildings?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/bb/7b/bb7bce2103ac8ed1224ffbb0c6ddf3c78b311a1c0bac521a82cad42219a4900e.mp3" - }, - "id": "68024574", - "published": "Mon, 20 Jun 2022 18:25:21 GMT", - "service": "patreon", - "shared_file": false, - "title": "12. The Long Straw", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:00:11 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/a1/3e/a13efa577d526a1aa274173394c97b1ce89f84e7d1bf7eacb5dccdb62f71aa57.png" - }, - { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/5b/d0/5bd0d237746a947c635e1ef4d08038c87172027a0e0785c1083b5d4656139326.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >



























< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/5b/d0/5bd0d237746a947c635e1ef4d08038c87172027a0e0785c1083b5d4656139326.mp3" - }, - "id": "67908936", - "published": "Fri, 17 Jun 2022 19:01:45 GMT", - "service": "patreon", - "shared_file": false, - "title": "11. The Long StrERROR at Function.loadStoryByNum()", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:01:14 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/5f/5e/5f5e113d1e9aa243fa6dfdbf6ff6ab0f5c8eeae2cbe81236a20dff5555334d2a.png" - }, - { - "name": "[ Audio Log ] Naps on the Cliffside.mp3", - "path": "/35/08/3508635378ad331baf2c1084a91047dacfc3028068cee5cea83a4477b66f0359.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


All that stands between you and freedom is a locked door, and all you have is a fork. You'll have to bend one of its points to pick the lock. Which one do you bend?

The Long Straw, The Surgery, or Flavored Water?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Naps on the Cliffside.mp3", - "path": "/35/08/3508635378ad331baf2c1084a91047dacfc3028068cee5cea83a4477b66f0359.mp3" - }, - "id": "67606882", - "published": "Fri, 10 Jun 2022 16:59:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "10. Naps on the Cliffside", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:01:59 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/87/57/8757d61e66132d9d32d08ae8ba8c618617537cd2c08656358d65c1c2c914347f.png" - }, - { - "name": "[ Audio Log ] Fgnall.mp3", - "path": "/1f/79/1f79373521a20cd6f8cf72b19bf490c261792bed899fea03564d8ac3887f1211.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

The elevator you normally take up to your apartment has 3 new buttons today. You don't recall any maintenance work being done recently. Your curiosity gets the better of you, and you decide to press one.

Naps on the Cliffside, The Long Straw, or The Surgery?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Fgnall.mp3", - "path": "/1f/79/1f79373521a20cd6f8cf72b19bf490c261792bed899fea03564d8ac3887f1211.mp3" - }, - "id": "67436555", - "published": "Mon, 06 Jun 2022 20:32:22 GMT", - "service": "patreon", - "shared_file": false, - "title": "09. Fgnall", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:02:29 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/e9/54/e954dcc27c16661576c170c85e2c95d0518ed28a29d60e934d277d2ca8023357.png" - }, - { - "name": "[ Audio Log ] - The Gnome.mp3", - "path": "/fc/38/fc382174920b91f6a84042962bea3604a5b5f1f541d6443891889bd21083876c.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Ahead of you, among the stalagmites you see the cavern diverging into 3. Each is a descent into darkness. But which one will you take?

Naps of the Cliffside,

The Long Straw,

or Fgnall?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Gnome.mp3", - "path": "/fc/38/fc382174920b91f6a84042962bea3604a5b5f1f541d6443891889bd21083876c.mp3" - }, - "id": "67305910", - "published": "Fri, 03 Jun 2022 17:46:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "08. The Gnome", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:03:10 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/b8/c4/b8c4d4e88128768d4f79ce70da095d7df707ef1920bd95fd2a154af1108360eb.png" - }, - { - "name": "[ Audio Log ] My Dad's New Box.mp3", - "path": "/79/ca/79ca9c2f566ecd96f96285eeb3b6976b503b7d120a561d2adb6b337ce60e4fd1.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Is it a hallucination, or is this submarine truly bigger than you remembered? Three new hatches on the floor of the engine room lead to depths unknown. Which will you choose?


The Gnome, Naps on the Cliffside, or The Long Straw?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] My Dad's New Box.mp3", - "path": "/79/ca/79ca9c2f566ecd96f96285eeb3b6976b503b7d120a561d2adb6b337ce60e4fd1.mp3" - }, - "id": "67104339", - "published": "Mon, 30 May 2022 22:18:46 GMT", - "service": "patreon", - "shared_file": false, - "title": "07. My Dad's New Box", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:04:08 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/8e/98/8e9874f97c5efbcf2df77e02d3068089d99751ec4809d5e29c412f7e9ccb2e85.png" - }, - { - "name": "[ Audio Log ] Nightly Prayer.mp3", - "path": "/3f/f9/3ff9a9ddd644ce4f2038ab51333d780362cabe4e04426a74abb99fee54ca819c.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


You don't remember this path through the woods. The wire fencing alongside it is rusted and overgrown with vine plants. They pull the iron back into the ground from which it came. Ahead of you, the road diverges into 3. Which way will you go?



[ The Gnome ], [ Naps on the Cliffside ], or [ My Dad's New Box ]?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Nightly Prayer.mp3", - "path": "/3f/f9/3ff9a9ddd644ce4f2038ab51333d780362cabe4e04426a74abb99fee54ca819c.mp3" - }, - "id": "66932176", - "published": "Thu, 26 May 2022 19:04:38 GMT", - "service": "patreon", - "shared_file": false, - "title": "06. Nightly Prayer", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:04:38 GMT", - "attachments": [ - { - "name": "logo black bg.png", - "path": "/74/46/74465d151b773c6f4ae66c177d5ecf8e533bf6ed094ebe8c8246d04ef509d78a.png" - } - ], - "content": "

Hello! \ud83d\udc4b I wanted to provide a good explanation of the gacha tier, for both current patrons who have questions about it, and those considering it in the future! I'll do it in a simple Q&A style.

Q: Who is the gacha tier for?

A: While the gacha system I've built over the past few months is quite cool, the $8.79 NICE + Gacha gacha tier is mainly for people who just want to give me even more support. Make no mistake, the $4.69 NICE tier is the big content tier for this Patreon -- The gacha system is just something a little extra I wanted to make for people who support me at higher levels.

Q: What do you get at the gacha tier?

A: Every 2 weeks or so, I will message you here on Patreon. I'll message you with a set of 3 (or 4 in some cases??) gacha rolls that have been rolled for you specifically.
\u26a0\ufe0f I can't sent images directly through Patreon messaging, and have to rely on links. However, here I'll include the images too just for illustrative purposes, and so this post isn't a massive text wall. \u26a0\ufe0f
That's being said, here is an example of the messages I sent out just today:

--- \u2702 --- \u2702 --- \u2702 ---


Hi Example Roll! This set of gacha rolls is generated automatically \ud83e\udd16 but delivered personally. \ud83d\udce8\u270c( So if you have any comments or questions, I'm here to respond to them! )

\ud83d\udcf0 News \ud83d\udcf0
\u2022 New rarity type: SECRET. Very rare, can only be acquired from specific 3-roll type combinations.
\u2022 6 new possible rolls, including 3 of standard rarity + 3 in the Secret category.
\u2022 Did a lot of refactoring and background code.
\u2022 Not that you'll ever see it...
\u2022 B-baka...


--- \u2702 --- \u2702 --- \u2702 ---

+ +~~~ \ud83d\udd2e ~~~+ +
[ Rolling you a gacha! ]
[ You got ... ]
[ ... ]
\ud83d\udc4d COMMON SMOL GHOST
https://i.ibb.co/mDKqv0b/Common-Smol-Ghost.png
\ud83d\udcac Shen's ghostly companion and perpetual roaster.



+ +~~~ \ud83d\udd2e ~~~+ +
[ Rolling you a gacha! ]
[ You got ... ]
[ ... ]
\ud83d\udd25 RARE J SKELETON
https://i.ibb.co/mBJfJjd/Rare-J-Skeleton.png
\ud83d\udcac J Skeleton dabbles in acting, and dreams of someday playing a role that isn't a villain.



+ +~~~ \ud83d\udd2e ~~~+ +
[ Rolling you a gacha! ]
[ You got ... ]
[ ... ]
\ud83d\udc4d COMMON SHEN
https://i.ibb.co/YLGRHPZ/Common-Shen.png
\ud83d\udcac Truly the plain bagel of gacha rolls.


Q: What can I do with the gachas?

A: Literally nothing. There is no gameplay.
There is only roll.
There is only roll.

Q: What are the gachas of?

A: Any character from any comic I've ever made, including Shen Comix, Bluechair, any side story like EDEN or My Life as a Skeleton! or The Little Firefighter or the doors series, Live With Yourself. Literally anything goes, this is like Shen Comix smash bros.


Q: How many are there?

A: At the time of this writing, 36 of various rarities.

Q: What if I am at the $7.07 Shen Tries to Explain tier, which was deprecated? Do I need to upgrade to the $8.79 tier to get gacha rolls?

A: Nope! You'll absolutely still get the gacha rolls at that tier, and don't need to upgrade. You could say you got \"rolled into\" the gacha tier, even. \ud83d\ude09

So, hopefully that clears some things up, but if I missed anything or you have any additional questions, ask away in the comments and I'll answer them personally and possibly add them to the Q&A.

Also, many people don't know that Patreon has a direct messaging system. So if you're in that tier and you didn't know about it, check your DMs! You probably have like a million rolls there waiting for you lmao.

", - "edited": null, - "embed": {}, - "file": { - "name": "logo black bg.png", - "path": "/74/46/74465d151b773c6f4ae66c177d5ecf8e533bf6ed094ebe8c8246d04ef509d78a.png" - }, - "id": "66803019", - "published": "Mon, 23 May 2022 22:42:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Meta ] Explanation of the Gacha Tier \ud83d\udd2e", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:05:02 GMT", - "attachments": [ - { - "name": "logo 22.09.06.png", - "path": "/06/0e/060e09e1d67d8cc41869fc09ed1cd337d7b6e6d67699cc6ca2370773d10f2153.png" - }, - { - "name": "I'm Here, Waiting.mp3", - "path": "/ad/06/ad06666b861a2d971faaedfb8dcd6f7af556b49396b637ca33af48cd8bec1179.mp3" - } - ], - "content": "


\u23f2\ufe0f \u00a001 - 10 \u00a0\u23f2\ufe0f

01. 3 Minutes \u00a0||| \u00a002. The Tall Grave


\u00a003. The Moon Skeleton\u00a0\u00a0||| \u00a0\u00a004. The Wheel


05. The Speedrun \u00a0\u00a0||| \u00a0\u00a006. Nightly Prayer


07. My Dad's New Box \u00a0\u00a0||| \u00a0\u00a008. The Gnome


09. Fgnall \u00a0\u00a0||| \u00a0\u00a010. Naps on the Cliffside


\ud83c\udf32 \u00a011 - 23 \u00a0\ud83c\udf32

11. Thunk \u00a0\u00a0||| \u00a0 12. The Long Straw


13. The Surgery \u00a0\u00a0||| \u00a0\u00a014. Missing Buildings\u00a0


15. Flavored Water \u00a0\u00a0||| \u00a0\u00a016. The Memory Pawn Shop\u00a0


17. The Clause \u00a0\u00a0||| \u00a0\u00a018. The Upside Down Cloud


19. Reach \u00a0\u00a0||| \u00a0\u00a020. Hell


21. A Well Full of Marbles \u00a0\u00a0||| \u00a0\u00a022. Demolition


23. Patching
", - "edited": null, - "embed": {}, - "file": { - "name": "I'm Here, Waiting.mp3", - "path": "/ad/06/ad06666b861a2d971faaedfb8dcd6f7af556b49396b637ca33af48cd8bec1179.mp3" - }, - "id": "66689004", - "published": "Fri, 20 May 2022 23:23:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Archive ] Catalogue of Increasingly Normal Stories", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:06:03 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/6d/b6/6db61a6978520a448bb60aa03eb985a2d6d3eb5a01abc9a55c29dea8ff26c7cd.png" - }, - { - "name": "[ Audio Log ] - The Speedrun.mp3", - "path": "/e9/26/e9269ca490cde7192978e226d526c391ec81fb2b0c6ec4c9f0a6426c67590972.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

Where do we go next? Tough decision, I know. But rest assured at least, that wherever we go, we'll go together:

NIGHTLY PRAYER or THE GNOME?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Speedrun.mp3", - "path": "/e9/26/e9269ca490cde7192978e226d526c391ec81fb2b0c6ec4c9f0a6426c67590972.mp3" - }, - "id": "66646000", - "published": "Thu, 19 May 2022 22:12:36 GMT", - "service": "patreon", - "shared_file": false, - "title": "05. The Speedrun", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:06:45 GMT", - "attachments": [ - { - "name": "wood fairy.png", - "path": "/87/0f/870f88ff1a3b7bff52c2c0a268c76976b9c11dfc420ec5329254138e1765ca32.png" - } - ], - "content": "

... of a \"fairy\" in the woods, you kindly offered to look into it. You have to admit, you weren't expecting something quite so big.

Do you wanna my process for something like this? Lemme show you! Even though this doesn't have a whole lot of rendering, I still went through a few iterations.

Iteration 01. After this, I copied the layer, and continued working on the copy. This was actually originally gonna be a normal-sized guy just covered in leaves, but at the last second I thought \"what if a giant head\" and decided that that was scarier.

Iteration 02. Aside form the lighting changes (which a hue/saturation/brightness adjustment layer did most of the work on), I decided to make the pupils big instead of small. You know how when a cat is about to pounce, its pupils get really big?

Iteration 03, the final that you see up top. A little bit more leaves. Some darker areas (shadows right under trees), some lighter areas (additional yellow highlights on eyes). The last 10%. At this stage I'm always nervous that I'm gonna ruin it somehow, but like, balls to it. It's my drawing, I'll ruin it all I want lmao

", - "edited": null, - "embed": {}, - "file": { - "name": "wood fairy.png", - "path": "/87/0f/870f88ff1a3b7bff52c2c0a268c76976b9c11dfc420ec5329254138e1765ca32.png" - }, - "id": "66438173", - "published": "Sun, 15 May 2022 03:23:14 GMT", - "service": "patreon", - "shared_file": false, - "title": "When you heard about the sightings ...", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:07:04 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/92/34/92341ab63bbe21befe9ef79f942c77df99fda675c30ec00c296eaf7d89701e0f.png" - }, - { - "name": "[ Audio Log ] - The Wheel.mp3", - "path": "/dd/70/dd7018054f88a104ee0927feec7ad4a903906d5957170d8e96c79c6a995e8c23.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Ahead of you, the path diverges into two.


What will it be? The Speedrun or Nightly Prayer?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Wheel.mp3", - "path": "/dd/70/dd7018054f88a104ee0927feec7ad4a903906d5957170d8e96c79c6a995e8c23.mp3" - }, - "id": "66382705", - "published": "Fri, 13 May 2022 16:20:30 GMT", - "service": "patreon", - "shared_file": false, - "title": "04. The Wheel", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:07:48 GMT", - "attachments": [], - "content": "

Oh, hello.

I see you've found yourself once again in my study of haunts. Were you surprised that the door you seemingly entered the manor through led you right back here? Hoho!

Well, I certainly wasn't. I've long been a denizen of this place, after all.

Anyhow, I'd like to offer you an opportunity, to choose your destiny ... and ask something of you too. Remember these?

I would like to declassify one of them, so that they may be viewed by the unsuspecting public. Which one should I declassify? The Moon Skeleton, 3 Minutes, or The Tall Grave? I'll leave some buttons and whatnot for you to decide below. Heaven knows, these newfangled personal computer machines, to me, are the greatest mystery of all.

Now, that's enough looking back. Time to look forward. Which of these stories would you like to hear next?

Decide carefully. For who knows. Whatever door you walk through here, may just be your last ....

.... but probably not ....

..... but maybe .....


", - "edited": null, - "embed": {}, - "file": {}, - "id": "66218736", - "published": "Mon, 09 May 2022 22:01:34 GMT", - "service": "patreon", - "shared_file": false, - "title": "Let's play a game.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:08:00 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/5d/9f/5d9fc73fdd374068246c9ce412b5b03adc313da4ded8e4336cae8515ff37f642.png" - }, - { - "name": "[ Audio Log ] - The Tall Grave.mp3", - "path": "/06/3d/063dd93cc58e52092884771590acf4c87e76d3993ff9537103cddd3f06f580e7.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Tall Grave.mp3", - "path": "/06/3d/063dd93cc58e52092884771590acf4c87e76d3993ff9537103cddd3f06f580e7.mp3" - }, - "id": "66063628", - "published": "Thu, 05 May 2022 23:47:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "02. The Tall Grave", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:08:40 GMT", - "attachments": [ - { - "name": "1080 01.png", - "path": "/87/99/8799b683100c10d6d04891169db5de5fb67b5fc653a6f18b7a64893710eb36e0.png" - }, - { - "name": "[ Audio Log ] - 3 Minutes.mp3", - "path": "/17/39/1739da673fdba5cc4ea19048cf2aca40c65c819fa36eb504a00b38828fb8dcb4.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - 3 Minutes.mp3", - "path": "/17/39/1739da673fdba5cc4ea19048cf2aca40c65c819fa36eb504a00b38828fb8dcb4.mp3" - }, - "id": "65980003", - "published": "Wed, 04 May 2022 02:45:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "01. 3 Minutes", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:09:19 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/cd/59/cd59194c19125332b21490172baec3e64123070c4b94f2fa87896d3ce64e259c.png" - }, - { - "name": "[ Audio Log ] - Moon Skeleton.mp3", - "path": "/43/a6/43a6667c8d40ed0b16fd037047469b7f1f2832b6ba8b6f53729234b53121e0c9.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - Moon Skeleton.mp3", - "path": "/43/a6/43a6667c8d40ed0b16fd037047469b7f1f2832b6ba8b6f53729234b53121e0c9.mp3" - }, - "id": "65911698", - "published": "Mon, 02 May 2022 17:37:33 GMT", - "service": "patreon", - "shared_file": false, - "title": "03. The Moon Skeleton", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:09:54 GMT", - "attachments": [ - { - "name": "Audio Log - ULTRABOOTMAN.mp3", - "path": "/99/97/9997c032c4ca190c3cb81313b9825ea1fa38a55a23d58930f4046786b0a8fbd9.mp3" - } - ], - "content": "


---


Check out the rest of the heroes at The Outliners instagram!

", - "edited": null, - "embed": {}, - "file": { - "name": "Audio Log - ULTRABOOTMAN.mp3", - "path": "/99/97/9997c032c4ca190c3cb81313b9825ea1fa38a55a23d58930f4046786b0a8fbd9.mp3" - }, - "id": "65731008", - "published": "Thu, 28 Apr 2022 19:52:12 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Late Access ] - ULTRABOOTMAN", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:10:56 GMT", - "attachments": [ - { - "name": "Audio Log - Buttons in the Dark 2.mp3", - "path": "/66/c6/66c6d95f71bc40c6a2dd56bbc034fbf87f590a7c7f95162c44495c2f1636476f.mp3" - } - ], - "content": "


", - "edited": null, - "embed": {}, - "file": { - "name": "Audio Log - Buttons in the Dark 2.mp3", - "path": "/66/c6/66c6d95f71bc40c6a2dd56bbc034fbf87f590a7c7f95162c44495c2f1636476f.mp3" - }, - "id": "65424136", - "published": "Thu, 21 Apr 2022 15:49:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Early Access ] - Buttons in the Dark ... V2!! (CW: blood)", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:11:38 GMT", - "attachments": [ - { - "name": "Audio Log - Buttons in the Dark.mp3", - "path": "/39/a8/39a84cb3443a64bef21f1f3ea9a043b7f8451a669dede69b638005e5285d9d75.mp3" - } - ], - "content": "


", - "edited": null, - "embed": {}, - "file": { - "name": "Audio Log - Buttons in the Dark.mp3", - "path": "/39/a8/39a84cb3443a64bef21f1f3ea9a043b7f8451a669dede69b638005e5285d9d75.mp3" - }, - "id": "65392885", - "published": "Wed, 20 Apr 2022 20:48:50 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Early Access ] - Buttons in the Dark", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:12:07 GMT", - "attachments": [], - "content": "

<< PREV | \u25a4 ARCHIVE

You purchase the \ud83d\udd25\ud83d\udd4a\ufe0f DIVINE \u2694\ufe0f GUNBLADEAXE \u2694\ufe0f of HELL\ud83d\udd4a\ufe0f\ud83d\udd25 for 30 gold.


Having sold his one thing, the frog closes his store.


He is free. He is going to go retire now. You have freed him.


But you can't retire. Not yet. You have a boss to fight.


You walk right into a ROOM MIMIC.


You take out the \ud83d\udd25\ud83d\udd4a\ufe0f Divine \u2694\ufe0f GunBladeAxe \u2694\ufe0f of Hell \ud83d\udd4a\ufe0f\ud83d\udd25 ...


Wanting nothing to do with that thing, the Room Mimic deposits you outside.


And there, at the end of a hallway made entirely of cement


You have found who you're looking for.


You've found the GREEN FRIEND. To make good on your promise, of course, you have to bring them to the fairy for calibration. Whether you do that immediately or wait a bit is up to you. We'll assume you can retrace your steps back out of Deephouse pretty easily.

---

Hey y'all, I'd like to take a break from creating EDEN. I'm just really tired, and between this, the new gacha thing, and Bluechair, my output of comics on social media has crawled to a standstill. So let's call this the end of Season 1. If EDEN is what you're here and you're out, absolutely no hard feelings, and if you wanna stick around, you'll be getting early access with commentary to all comics, and those of you in the gacha tier will be getting gacha rolls.

Thanks! \u270c\ufe0f

~ Shen\u00a0

", - "edited": null, - "embed": {}, - "file": {}, - "id": "65214407", - "published": "Sat, 16 Apr 2022 16:09:43 GMT", - "service": "patreon", - "shared_file": false, - "title": "EDEN { 47 }", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:12:38 GMT", - "attachments": [ - { - "name": "poster 2000.png", - "path": "/2a/f6/2af6b64c81c7f426f61ead38eee79f62eed56ad697b4d466288446ff3a67b295.png" - } - ], - "content": "

Will be live in like 20min @ https://www.twitch.tv/valdevia\u00a0

", - "edited": null, - "embed": {}, - "file": { - "name": "poster 2000.png", - "path": "/2a/f6/2af6b64c81c7f426f61ead38eee79f62eed56ad697b4d466288446ff3a67b295.png" - }, - "id": "64974747", - "published": "Sun, 10 Apr 2022 21:07:30 GMT", - "service": "patreon", - "shared_file": false, - "title": "I'm on a stream soon! Just a heads \u261d\ufe0f", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:13:45 GMT", - "attachments": [], - "content": "


", - "edited": null, - "embed": {}, - "file": {}, - "id": "64968926", - "published": "Sun, 10 Apr 2022 18:21:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "What if Shen but girl.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:13:52 GMT", - "attachments": [ - { - "name": "Secret Audio Log - Ass Kicking.mp3", - "path": "/13/9c/139c68f799aa1056f9be0bd5a5376059465284e975af3e60c8fa43b35da792bd.mp3" - } - ], - "content": "



", - "edited": null, - "embed": {}, - "file": { - "name": "Secret Audio Log - Ass Kicking.mp3", - "path": "/13/9c/139c68f799aa1056f9be0bd5a5376059465284e975af3e60c8fa43b35da792bd.mp3" - }, - "id": "64828106", - "published": "Thu, 07 Apr 2022 03:41:33 GMT", - "service": "patreon", - "shared_file": false, - "title": "NOW YOU'VE DONE IT.", - "user": "72813" - } -] diff --git a/testing/shen_post_api_page_two.json b/testing/shen_post_api_page_two.json deleted file mode 100644 index 2625aed..0000000 --- a/testing/shen_post_api_page_two.json +++ /dev/null @@ -1,1054 +0,0 @@ -[ - { - "added": "Mon, 20 Feb 2023 19:44:54 GMT", - "attachments": [], - "content": "

You inform The Bad Guy that magic isn't real.

Wow. You've broken his innocent, childlike belief in magic.

How could you do this.

You monster.

You also pull his hat down over his face for good measure.

This causes him to get so angry that, despite having lost his innocent, childlike belief in magic, he develops an rational, adult belief in magic.

He starts blasting off fireballs every which way.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "71062351", - "published": "Fri, 26 Aug 2022 13:00:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "Remind him that magic doesn't exist", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:45:14 GMT", - "attachments": [], - "content": "

You attempt to push the Mountain Bastard back down the slope.

But your plan is thwarted by The Bad Guy, who just arrived and catches him.

The Bad Guy then remembers that he's the bad guy and throws the Mountain Bastard down the slope, thereby unthwarting your plan.

Realizing that he can no longer use weapons, The Bad Guy changes his class to Mage.

You're thinking this might be a boss battle.

Oh yeah. Yep. It just started snowing. This is definitely a boss battle.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70996043", - "published": "Thu, 25 Aug 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Push Mountain Bastard back down the slope", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:45:34 GMT", - "attachments": [], - "content": "

What is your wisdom, Mountain Bastard?

\"My whole life I've been ascending this mountain. I've walked through snowstorms where I couldn't even see 6 feet in front of me. I've gotten caught in avalanches. Sometimes I slid backwards without even noticing. After all that, I'm still not sure if this is the peak.\"

\"But right now, I've stopped to appreciate this view. Even to you, this is a nice view, no doubt. But you've simply flown up here. To you, this is like reading the ending of a good book that you haven't read. You can tell the book was good, but don't quite have the context to find the ending beautiful.

But to me, who has read the book?

Who, hell, as LEARNED to read just to read this book?\"

\"This view is glorious.\"

Thank you for your wisdom, Mountain Bastard.

What next?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70943219", - "published": "Wed, 24 Aug 2022 13:01:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask for the Mountain Bastard's wisdom.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:45:55 GMT", - "attachments": [], - "content": "

You pickpocket the universe, grabbing the entire \"weapon\" item class.

Technically, Miner Character has a pick, which is a tool.

The Bad Guy has a stalactite (or stalagmite), which is a rock formation.

They get to keep them, but can no longer use them as weapons.

The Bad Guy resolves to hurt you emotionally instead of physically.

Your knife can now only be used for cooking.

You fly up to the top of the mountain.

The Sky is here.

But so is The Mountain Bastard.

What will you do now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70897713", - "published": "Tue, 23 Aug 2022 13:00:06 GMT", - "service": "patreon", - "shared_file": false, - "title": "Steal the concept of weapons", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:46:22 GMT", - "attachments": [], - "content": "

The butterfly lands on your back in an effort to catch you.

You're not sure why you thought a butterfly could lift an entire person.

Actually nevermind, you were right and a genius.

Wow. This has truly become a homestuck.

The Bad Guy and Miner Character are both pissed at you now. Miner Character seems to be able to break through stone quite easily. The Bad Guy is now wielding a stalagmite, or possibly a stalactite, as a weapon. You're not sure how strong that guy is even hypothetically.

I eagerly await what you do next.

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70853491", - "published": "Mon, 22 Aug 2022 13:01:05 GMT", - "service": "patreon", - "shared_file": false, - "title": "Ask the butterfly to catch you", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:46:43 GMT", - "attachments": [], - "content": "

You mine a block under him. Unfortunately there's just another solid block there, so all you've done is make him shorter. I get what you were going for though, it would've been funny.

The miner character punches you in the shin.

You are now careening through the air. You're on collision course with the butterfly, and behind the butterfly is a cliff. You cartoonishly left the pickaxe in the air, but you still have the knife.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70808920", - "published": "Sun, 21 Aug 2022 13:00:06 GMT", - "service": "patreon", - "shared_file": false, - "title": "Mine the blocks under him", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:47:06 GMT", - "attachments": [], - "content": "

You pickpocket randomly in the darkness.

You've pocketed a PICK!

The miner you just stole it from turns on his headlamp.

\"Hey, what gives, asshole?? Give me my pick back!\"

He seems pretty miffed about this whole situation. If you don't give him his pick back, there might be a tussle. But then again, maybe you can get past him somehow.

After all, he is just

just a

miner character.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70769224", - "published": "Sat, 20 Aug 2022 13:00:06 GMT", - "service": "patreon", - "shared_file": false, - "title": "Use pickpocket skill", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:47:20 GMT", - "attachments": [ - { - "name": "1500 02.png", - "path": "/46/33/46331de7756705278b612cc3f1f355bc580374a00555a4d27e80da471b797506.png" - }, - { - "name": "[ Audio Log ] A Well Full of Marbles.mp3", - "path": "/3a/88/3a88c586767d9aadb458af5e7c8ddede66ce8ced338d51c4da3fd2db904fb297.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Oh were you expecting a CHOICE here??

Not today buddy. We've only got 2 stories left so it's time for the RAILROAD.

We're gonna start off with Demolition, a story about what happens when you demolish a haunted house. Then we'll do Patching, a story about artificial intelligence.

Patching is the one I want to do last, so that leaves on Demolition for 2nd-to-last, but Demolition is also quite good imo. See you there!

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] A Well Full of Marbles.mp3", - "path": "/3a/88/3a88c586767d9aadb458af5e7c8ddede66ce8ced338d51c4da3fd2db904fb297.mp3" - }, - "id": "70745940", - "published": "Fri, 19 Aug 2022 15:59:32 GMT", - "service": "patreon", - "shared_file": false, - "title": "21. A Well Full of Marbles", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:48:55 GMT", - "attachments": [], - "content": "

You change your class to Thief.

You now have +5 to health and can slither into any opening. Including this one!

To really seal the deal though, you decide to think some evil thoughts, like your nemesis, The Bad Guy would do.

Frankly, you never want to visit those dark recesses of your mind. You enter the hole.

Damn, it is dark in here. Holy shit.

You do like 10 immaculately animated backflips and a hyper-detailed magical girl transformation. This happens, I swear. You also draw a really sick-looking mech, but then destroy the drawing, and also change back to your normal clothes. Too bad this is all in the dark.

What do you want to do now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70716118", - "published": "Fri, 19 Aug 2022 13:01:03 GMT", - "service": "patreon", - "shared_file": false, - "title": "Change classes to thief.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:49:25 GMT", - "attachments": [], - "content": "

Hey!

Been a while since the last news update. As a thank you for reading this, I included a gacha roll at the end.\u00a0

---

New Patrons - Can I do a thank you thing??

Hey, patrons that joined this week, would you be okay with me using your names in a \"thank you new patrons!\" thing at the end of my next patreon comic? I'm asking to see how people feel about it in general, as I know some of you use your real names on here, and don't wanna violate anyone's privacy. \u270c\ufe0f Maybe like first names only? Does anyone know what the etiquette is on this?

---

Catalogue of Increasingly Normal Stories - RIP

I do unfortunately have to start bringing Catalogue of Increasingly Normal Stories (or \"increasingly normal\", as I've been tagging it) to a close. It was probably the biggest + most organized non-just-random-comics project I've ever done, and I'm quite proud of it actually.

Buuut it is also immensely stressful for me. These past few weeks, I've been obliterating myself trying to get those done. Not to mention, the numbers look grimmer than the stories themselves. \ud83d\ude05 I think I'm always gonna wanna do weird, longer-form, creepy stories, but it seems like maybe this forced approach just isn't working for me or for many of you readers.

SHOUT OUT TO THE PEOPLE THAT LIKE THEM THOUGH! I see you.

After the two upcoming ones that I already have slated, I'm gonna finish it off with a bang with one of I think the best stories I've ever written.

---

And lastly, the ...

\ud83d\udd2e Gacha Roll! \ud83d\udd2e

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udc4d COMMON WACKY ROOMMATES

\ud83d\udcac Jerry from the iconic Shen Comix mini-series Wacky Roommates! Oh... you... you don't know what that is? Oh ...


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\u2728\ud83c\udf1f\u2728 ULTRA-RARE MEME COMIC

\ud83d\udcac The original iteration of this comic wasn't quite satisfying to me. So I remade it! Check it out: https://i.ibb.co/tH7LfpS/page.png\u00a0


\u00a0+ +~~~ \ud83d\udd2e ~~~+ +\u00a0

[ Rolling you a gacha! ]

[ You got ... ]

[ ... ]

\ud83d\udd25 RARE J SKELETON

\ud83d\udcac J Skeleton dabbles in acting, and dreams of someday playing a role that isn't a villain.

---

Wowza, what a roll?? This was fair and square, the first one that popped up. If you have any questions about anything, I'll be perusing the comments to answer them. Thx for reading! \ud83d\udc4b

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70668831", - "published": "Thu, 18 Aug 2022 21:01:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "News + A Gacha Roll", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:49:35 GMT", - "attachments": [], - "content": "

You arrive at the site of impact to find the knife, as well as a hole where The Bad Guy hit the rock wall, perfectly in the shape of his body.

Too bad it is not in the shape of your body. If this hole was shaped like you, you could go through it. But instead it is in the shape of your dastardly nemesis, The Bad Guy.

Dang it.

Darn, even.

Anyway, you have the dagger now. It's pretty sick. Possibly cursed and/or haunted.

You look back at the butterfly for approval.

Wow. There you have it.

You're not sure if this butterfly is a good influence on you or not.

What do you want to do next?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70668428", - "published": "Thu, 18 Aug 2022 13:00:10 GMT", - "service": "patreon", - "shared_file": false, - "title": "Retrieve the knife.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:02 GMT", - "attachments": [], - "content": "

You catch The Bad Guy by surprise with a well-placed shin kick,

Do you wanna follow that up or?

I mean, no pressure. He's probably defeated. You can do other stuff if you want.

So, what do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70661972", - "published": "Wed, 17 Aug 2022 20:27:53 GMT", - "service": "patreon", - "shared_file": false, - "title": "Kick him in the shin.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:15 GMT", - "attachments": [], - "content": "

You walk to the right.

There you find your nemesis, The Bad Guy.

He's just like you, but evil.

You can tell by the expression of sheer malice on his face.

And also by the fact that he has a knife.

The Bad Guy brandishes the knife at you. This is like a mugging, except what he wants is not your money, but your joy. He wants to steal your smile.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70605413", - "published": "Wed, 17 Aug 2022 13:00:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Walk to the right.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:34 GMT", - "attachments": [], - "content": "

You lay down and contemplate the sky.

The sky contemplates you back.

You contemplate harder.

The sky contemplates even harder.

The sky has been just up there for thousands of years, contemplating the shit out of people. This is the final boss of contemplation you're dealing with here. What were you thinking? You should have challenged maybe a rock or a tree first.

Basically, you don't think you're gonna win this one.

What now?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70568003", - "published": "Tue, 16 Aug 2022 13:00:09 GMT", - "service": "patreon", - "shared_file": false, - "title": "Contemplate the sky.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:50:51 GMT", - "attachments": [], - "content": "

You can do a little dance, but it will not be a happy one.

You perform a sorrowful interpretive arrangement. It speaks of suffering. It speaks of the human condition.

A nearby butterfly is brought to tears.

Now what?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70527415", - "published": "Mon, 15 Aug 2022 13:01:04 GMT", - "service": "patreon", - "shared_file": false, - "title": "Do a little happy dance.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:51:04 GMT", - "attachments": [], - "content": "

You are in the place.

What do you do?

", - "edited": null, - "embed": {}, - "file": {}, - "id": "70526592", - "published": "Mon, 15 Aug 2022 00:24:28 GMT", - "service": "patreon", - "shared_file": false, - "title": "You are the guy.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:51:07 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/f4/58/f45873ce41cb60b505fa9fd8c2ea4850897815d485d084cdaa33d06c603c7c8c.png" - }, - { - "name": "[ Audio Log ] Hell.mp3", - "path": "/9e/c3/9ec3bc6b759f34b73ae8eaba377dcfbe06f217e12ce2dbcf9eec329d5a2be43e.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >













2 orbs appears before you. One is so small that you could fit it in the palm of your hand. The other is so large that it could crush you.

Which will it be?

The marble, or the wrecking ball?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Hell.mp3", - "path": "/9e/c3/9ec3bc6b759f34b73ae8eaba377dcfbe06f217e12ce2dbcf9eec329d5a2be43e.mp3" - }, - "id": "70489194", - "published": "Sun, 14 Aug 2022 01:33:15 GMT", - "service": "patreon", - "shared_file": false, - "title": "20. Hell", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:52:32 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/d7/6a/d76afcc5eb98af3b2d07e13cf944eec3bb22a45ad75d3cecd53f34b93e4d4260.png" - }, - { - "name": "[ Audio Log ] Reach.mp3", - "path": "/59/34/593472993f57f3a9383a2dcc905895c8c4bd9a325108a065e278da15ffa9c53b.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >\u00a0


You're up on a mountain, and a severe blizzard has separated you from your fellow climber. Through the snow, you just just barely make out a figure ... no, wait. There are two figures. One of them must be him. Which do you approach?

A Well Full of Marbles or Hell?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Reach.mp3", - "path": "/59/34/593472993f57f3a9383a2dcc905895c8c4bd9a325108a065e278da15ffa9c53b.mp3" - }, - "id": "70114372", - "published": "Fri, 05 Aug 2022 18:01:54 GMT", - "service": "patreon", - "shared_file": false, - "title": "19. Reach", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:53:31 GMT", - "attachments": [ - { - "name": "face.png", - "path": "/d7/74/d774881f8cea7db4c830f3dc9a15c2c3fac20b78bb6cbe312d42b53330fe9b6d.png" - } - ], - "content": "

This is a face for you only. Nobody outside of here even knows that I drew this face. You are among the select few who, as a result of the particular conditions of your life that have led you here, know about it.

There are a billion different timelines in which you made different choices and never ended up seeing this face.

But you are in this one.

What am I to say.

What am I to say except congratulations.

", - "edited": null, - "embed": {}, - "file": { - "name": "face.png", - "path": "/d7/74/d774881f8cea7db4c830f3dc9a15c2c3fac20b78bb6cbe312d42b53330fe9b6d.png" - }, - "id": "69844726", - "published": "Sun, 31 Jul 2022 17:29:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "Patreon-Exclusive Face", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:53:41 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/64/1e/641ed34a42a894de9eba257629be2e98eafdfdeef81e21cc90bd74bfdec62daf.png" - }, - { - "name": "[ Audio Log ] Upside Down Cloud.mp3", - "path": "/c3/0f/c30fcd6964f3e3fa4192947fce8b67a0a57406725f78100177006e6cba31100f.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >\u00a0







Two roads diverge ahead of you.

But then they converge again.

But then they diverge again.

What will it be? Reach or A Well Full of Marbles?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Upside Down Cloud.mp3", - "path": "/c3/0f/c30fcd6964f3e3fa4192947fce8b67a0a57406725f78100177006e6cba31100f.mp3" - }, - "id": "69806320", - "published": "Sat, 30 Jul 2022 20:24:13 GMT", - "service": "patreon", - "shared_file": false, - "title": "18. The Upside Down Cloud", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:54:41 GMT", - "attachments": [ - { - "name": "titlecard.png", - "path": "/a0/52/a05268e7458a1498a7a36d67ab723f468c74cc180b3a92991f9ee82bfafdd27d.png" - }, - { - "name": "[ Audio Log ] The Clause.mp3", - "path": "/87/49/87490fd9aa568042f78f3845d6f8edd0bc8531c548fb27b33b9df2918bae827a.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >









You're feeling around in the dark. You feel two switches on the wall. One of them, you remember, is the light switch, but the other one is the room wide blender. Which do you hit?

Upside Down Cloud or Reach?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Clause.mp3", - "path": "/87/49/87490fd9aa568042f78f3845d6f8edd0bc8531c548fb27b33b9df2918bae827a.mp3" - }, - "id": "69437650", - "published": "Fri, 22 Jul 2022 18:25:11 GMT", - "service": "patreon", - "shared_file": false, - "title": "17. The Clause", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:55:31 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/04/f0/04f017f9fb7a49a142e93ce964cc5a2fc750f67e462fe72bffc77b31e3091f40.png" - }, - { - "name": "[ Audio Log ] The Memory Pawn Shop.mp3", - "path": "/4d/2c/4d2cdd65a37c29ae6cc80a725025c377810b52bd81d4d9760abed1b831c7f022.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >\u00a0


You're almost done with your ritual, but close the book by accident. Aw shit. You don't have much time. Which page was it on again?

The Clause of Upside Down Cloud?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Memory Pawn Shop.mp3", - "path": "/4d/2c/4d2cdd65a37c29ae6cc80a725025c377810b52bd81d4d9760abed1b831c7f022.mp3" - }, - "id": "69267254", - "published": "Mon, 18 Jul 2022 22:41:37 GMT", - "service": "patreon", - "shared_file": false, - "title": "16. The Memory Pawn Shop", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:56:03 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/46/f6/46f6e2ef387e15096ed337eb5beeda13ef4000322f1cf863b8f1cbc80ed407ca.png" - }, - { - "name": "[ Audio Log ] Flavored Water.mp3", - "path": "/21/12/211243db7367582e02ce50615a01d5da264eb5da676e39742fe4405c140dde59.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

You tried to launch fortnite, but didn't read the icon careful, and accidentally launched ...

HAUNTED FORTNITE.

Where are you dropping?

The Memory Pawn Shop or The Clause?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Flavored Water.mp3", - "path": "/21/12/211243db7367582e02ce50615a01d5da264eb5da676e39742fe4405c140dde59.mp3" - }, - "id": "68972303", - "published": "Tue, 12 Jul 2022 01:09:33 GMT", - "service": "patreon", - "shared_file": false, - "title": "15. Flavored Water", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:56:44 GMT", - "attachments": [ - { - "name": "02.png", - "path": "/2a/80/2a808d30306df8f86889836214caec3aa5000c42308d3592c687d7c21f3fa9fd.png" - }, - { - "name": "[ Audio Log ] Shen Comix Minicast.mp3", - "path": "/e6/1f/e61f1bf98c63540a9e2cd10cad8dab221d2a2aab85154ead0c47d06be2a442b3.mp3" - } - ], - "content": "

Old Avatar

New Avatar

Old Logo

New Logo

Old Scary Stories/Comics Logo

New Scary Stories/Comics Logo (Probably most WIP of the bunch)

Also, something I forgot to mention in the audio log: If you're one of those people who forgot they left their subscription on, keep in mind it charges on the first of the month! Which is the day after tomorrow, 07/01.

So, as much as I will happily gobble up your dollars, don't forget to cancel it if you mean to, and if you do forget and are reading this like a week later, feel free to DM me & I can refund it, it's actually pretty easy on here. \ud83d\udc4d

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Shen Comix Minicast.mp3", - "path": "/e6/1f/e61f1bf98c63540a9e2cd10cad8dab221d2a2aab85154ead0c47d06be2a442b3.mp3" - }, - "id": "68433820", - "published": "Wed, 29 Jun 2022 23:03:08 GMT", - "service": "patreon", - "shared_file": false, - "title": "Redesign + The Patreon + L + Ratio", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:57:26 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/6d/be/6dbecdc5dc62f57b5353ca49a675b6ec8d3306af1206d676d2f07d40a713e9dc.png" - }, - { - "name": "[ Audio Log ] Missing Buildings.mp3", - "path": "/b6/18/b61899fc66b0f3bbbc3fa74fa795ca647068eed7b14532e6a224865bceb99b09.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

The cave entrance is collapsing, and you only have time to grab one flashlight. The problem is, you brought 2 duds -- only one of them works. Which one was the working one again?

Flavored Water, The Memory Pawn Shop, or The Clause?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Missing Buildings.mp3", - "path": "/b6/18/b61899fc66b0f3bbbc3fa74fa795ca647068eed7b14532e6a224865bceb99b09.mp3" - }, - "id": "68341058", - "published": "Mon, 27 Jun 2022 23:43:43 GMT", - "service": "patreon", - "shared_file": false, - "title": "14. Missing Buildings", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:58:12 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/99/ae/99ae0ef587e4acccb9e4987857c23a9b45e725bf2f231d88ecc08fce039b074d.png" - }, - { - "name": "[ Audio Log ] The Surgery.mp3", - "path": "/ed/f3/edf30a2898bb6a2cb16e8e3e87b4f75c43bdf62ef08f6325ef8afc18b612795f.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

You never should have gone on this satellite repair mission. As you look back down, you see not 1 Earth, but 3 Earths, all orbiting each other chaotically. Which ... one did you launch from again?

Flavored Water, Missing Buildings, or The Memory Pawn Shop?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Surgery.mp3", - "path": "/ed/f3/edf30a2898bb6a2cb16e8e3e87b4f75c43bdf62ef08f6325ef8afc18b612795f.mp3" - }, - "id": "68202290", - "published": "Fri, 24 Jun 2022 17:26:07 GMT", - "service": "patreon", - "shared_file": false, - "title": "13. The Surgery", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:58:54 GMT", - "attachments": [ - { - "name": "1500 03.png", - "path": "/97/39/9739455f889528f42493e1c3b13dfcf78e47c8e52c9b9debc404fd90fb950417.png" - }, - { - "name": "[ Audio Log ] POV You're a File.mp3", - "path": "/3f/2f/3f2fcca58e489e04ac3ff8dc4dce1a35bdbc8349c6b65f4d24eb4574b1ea9dba.mp3" - } - ], - "content": "


", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] POV You're a File.mp3", - "path": "/3f/2f/3f2fcca58e489e04ac3ff8dc4dce1a35bdbc8349c6b65f4d24eb4574b1ea9dba.mp3" - }, - "id": "68113175", - "published": "Wed, 22 Jun 2022 18:12:53 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Detour ] POV: You're a File You Made as a Kid", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 19:59:18 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/a1/3e/a13efa577d526a1aa274173394c97b1ce89f84e7d1bf7eacb5dccdb62f71aa57.png" - }, - { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/bb/7b/bb7bce2103ac8ed1224ffbb0c6ddf3c78b311a1c0bac521a82cad42219a4900e.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


You never should've tried to summon a demon -- you used the wrong number of candles, and summoned 3 instead of 1. Luckily, only one of them can manifest, for now at least. Up to you to decide which. So?

Will it be The Surgery, Flavored Water, or Missing Buildings?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/bb/7b/bb7bce2103ac8ed1224ffbb0c6ddf3c78b311a1c0bac521a82cad42219a4900e.mp3" - }, - "id": "68024574", - "published": "Mon, 20 Jun 2022 18:25:21 GMT", - "service": "patreon", - "shared_file": false, - "title": "12. The Long Straw", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:00:11 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/a1/3e/a13efa577d526a1aa274173394c97b1ce89f84e7d1bf7eacb5dccdb62f71aa57.png" - }, - { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/5b/d0/5bd0d237746a947c635e1ef4d08038c87172027a0e0785c1083b5d4656139326.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >



























< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] The Long Straw.mp3", - "path": "/5b/d0/5bd0d237746a947c635e1ef4d08038c87172027a0e0785c1083b5d4656139326.mp3" - }, - "id": "67908936", - "published": "Fri, 17 Jun 2022 19:01:45 GMT", - "service": "patreon", - "shared_file": false, - "title": "11. The Long StrERROR at Function.loadStoryByNum()", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:01:14 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/5f/5e/5f5e113d1e9aa243fa6dfdbf6ff6ab0f5c8eeae2cbe81236a20dff5555334d2a.png" - }, - { - "name": "[ Audio Log ] Naps on the Cliffside.mp3", - "path": "/35/08/3508635378ad331baf2c1084a91047dacfc3028068cee5cea83a4477b66f0359.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


All that stands between you and freedom is a locked door, and all you have is a fork. You'll have to bend one of its points to pick the lock. Which one do you bend?

The Long Straw, The Surgery, or Flavored Water?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Naps on the Cliffside.mp3", - "path": "/35/08/3508635378ad331baf2c1084a91047dacfc3028068cee5cea83a4477b66f0359.mp3" - }, - "id": "67606882", - "published": "Fri, 10 Jun 2022 16:59:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "10. Naps on the Cliffside", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:01:59 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/87/57/8757d61e66132d9d32d08ae8ba8c618617537cd2c08656358d65c1c2c914347f.png" - }, - { - "name": "[ Audio Log ] Fgnall.mp3", - "path": "/1f/79/1f79373521a20cd6f8cf72b19bf490c261792bed899fea03564d8ac3887f1211.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

The elevator you normally take up to your apartment has 3 new buttons today. You don't recall any maintenance work being done recently. Your curiosity gets the better of you, and you decide to press one.

Naps on the Cliffside, The Long Straw, or The Surgery?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Fgnall.mp3", - "path": "/1f/79/1f79373521a20cd6f8cf72b19bf490c261792bed899fea03564d8ac3887f1211.mp3" - }, - "id": "67436555", - "published": "Mon, 06 Jun 2022 20:32:22 GMT", - "service": "patreon", - "shared_file": false, - "title": "09. Fgnall", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:02:29 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/e9/54/e954dcc27c16661576c170c85e2c95d0518ed28a29d60e934d277d2ca8023357.png" - }, - { - "name": "[ Audio Log ] - The Gnome.mp3", - "path": "/fc/38/fc382174920b91f6a84042962bea3604a5b5f1f541d6443891889bd21083876c.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Ahead of you, among the stalagmites you see the cavern diverging into 3. Each is a descent into darkness. But which one will you take?

Naps of the Cliffside,

The Long Straw,

or Fgnall?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Gnome.mp3", - "path": "/fc/38/fc382174920b91f6a84042962bea3604a5b5f1f541d6443891889bd21083876c.mp3" - }, - "id": "67305910", - "published": "Fri, 03 Jun 2022 17:46:58 GMT", - "service": "patreon", - "shared_file": false, - "title": "08. The Gnome", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:03:10 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/b8/c4/b8c4d4e88128768d4f79ce70da095d7df707ef1920bd95fd2a154af1108360eb.png" - }, - { - "name": "[ Audio Log ] My Dad's New Box.mp3", - "path": "/79/ca/79ca9c2f566ecd96f96285eeb3b6976b503b7d120a561d2adb6b337ce60e4fd1.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Is it a hallucination, or is this submarine truly bigger than you remembered? Three new hatches on the floor of the engine room lead to depths unknown. Which will you choose?


The Gnome, Naps on the Cliffside, or The Long Straw?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] My Dad's New Box.mp3", - "path": "/79/ca/79ca9c2f566ecd96f96285eeb3b6976b503b7d120a561d2adb6b337ce60e4fd1.mp3" - }, - "id": "67104339", - "published": "Mon, 30 May 2022 22:18:46 GMT", - "service": "patreon", - "shared_file": false, - "title": "07. My Dad's New Box", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:04:08 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/8e/98/8e9874f97c5efbcf2df77e02d3068089d99751ec4809d5e29c412f7e9ccb2e85.png" - }, - { - "name": "[ Audio Log ] Nightly Prayer.mp3", - "path": "/3f/f9/3ff9a9ddd644ce4f2038ab51333d780362cabe4e04426a74abb99fee54ca819c.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


You don't remember this path through the woods. The wire fencing alongside it is rusted and overgrown with vine plants. They pull the iron back into the ground from which it came. Ahead of you, the road diverges into 3. Which way will you go?



[ The Gnome ], [ Naps on the Cliffside ], or [ My Dad's New Box ]?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] Nightly Prayer.mp3", - "path": "/3f/f9/3ff9a9ddd644ce4f2038ab51333d780362cabe4e04426a74abb99fee54ca819c.mp3" - }, - "id": "66932176", - "published": "Thu, 26 May 2022 19:04:38 GMT", - "service": "patreon", - "shared_file": false, - "title": "06. Nightly Prayer", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:04:38 GMT", - "attachments": [ - { - "name": "logo black bg.png", - "path": "/74/46/74465d151b773c6f4ae66c177d5ecf8e533bf6ed094ebe8c8246d04ef509d78a.png" - } - ], - "content": "

Hello! \ud83d\udc4b I wanted to provide a good explanation of the gacha tier, for both current patrons who have questions about it, and those considering it in the future! I'll do it in a simple Q&A style.

Q: Who is the gacha tier for?

A: While the gacha system I've built over the past few months is quite cool, the $8.79 NICE + Gacha gacha tier is mainly for people who just want to give me even more support. Make no mistake, the $4.69 NICE tier is the big content tier for this Patreon -- The gacha system is just something a little extra I wanted to make for people who support me at higher levels.

Q: What do you get at the gacha tier?

A: Every 2 weeks or so, I will message you here on Patreon. I'll message you with a set of 3 (or 4 in some cases??) gacha rolls that have been rolled for you specifically.
\u26a0\ufe0f I can't sent images directly through Patreon messaging, and have to rely on links. However, here I'll include the images too just for illustrative purposes, and so this post isn't a massive text wall. \u26a0\ufe0f
That's being said, here is an example of the messages I sent out just today:

--- \u2702 --- \u2702 --- \u2702 ---


Hi Example Roll! This set of gacha rolls is generated automatically \ud83e\udd16 but delivered personally. \ud83d\udce8\u270c( So if you have any comments or questions, I'm here to respond to them! )

\ud83d\udcf0 News \ud83d\udcf0
\u2022 New rarity type: SECRET. Very rare, can only be acquired from specific 3-roll type combinations.
\u2022 6 new possible rolls, including 3 of standard rarity + 3 in the Secret category.
\u2022 Did a lot of refactoring and background code.
\u2022 Not that you'll ever see it...
\u2022 B-baka...


--- \u2702 --- \u2702 --- \u2702 ---

+ +~~~ \ud83d\udd2e ~~~+ +
[ Rolling you a gacha! ]
[ You got ... ]
[ ... ]
\ud83d\udc4d COMMON SMOL GHOST
https://i.ibb.co/mDKqv0b/Common-Smol-Ghost.png
\ud83d\udcac Shen's ghostly companion and perpetual roaster.



+ +~~~ \ud83d\udd2e ~~~+ +
[ Rolling you a gacha! ]
[ You got ... ]
[ ... ]
\ud83d\udd25 RARE J SKELETON
https://i.ibb.co/mBJfJjd/Rare-J-Skeleton.png
\ud83d\udcac J Skeleton dabbles in acting, and dreams of someday playing a role that isn't a villain.



+ +~~~ \ud83d\udd2e ~~~+ +
[ Rolling you a gacha! ]
[ You got ... ]
[ ... ]
\ud83d\udc4d COMMON SHEN
https://i.ibb.co/YLGRHPZ/Common-Shen.png
\ud83d\udcac Truly the plain bagel of gacha rolls.


Q: What can I do with the gachas?

A: Literally nothing. There is no gameplay.
There is only roll.
There is only roll.

Q: What are the gachas of?

A: Any character from any comic I've ever made, including Shen Comix, Bluechair, any side story like EDEN or My Life as a Skeleton! or The Little Firefighter or the doors series, Live With Yourself. Literally anything goes, this is like Shen Comix smash bros.


Q: How many are there?

A: At the time of this writing, 36 of various rarities.

Q: What if I am at the $7.07 Shen Tries to Explain tier, which was deprecated? Do I need to upgrade to the $8.79 tier to get gacha rolls?

A: Nope! You'll absolutely still get the gacha rolls at that tier, and don't need to upgrade. You could say you got \"rolled into\" the gacha tier, even. \ud83d\ude09

So, hopefully that clears some things up, but if I missed anything or you have any additional questions, ask away in the comments and I'll answer them personally and possibly add them to the Q&A.

Also, many people don't know that Patreon has a direct messaging system. So if you're in that tier and you didn't know about it, check your DMs! You probably have like a million rolls there waiting for you lmao.

", - "edited": null, - "embed": {}, - "file": { - "name": "logo black bg.png", - "path": "/74/46/74465d151b773c6f4ae66c177d5ecf8e533bf6ed094ebe8c8246d04ef509d78a.png" - }, - "id": "66803019", - "published": "Mon, 23 May 2022 22:42:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Meta ] Explanation of the Gacha Tier \ud83d\udd2e", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:05:02 GMT", - "attachments": [ - { - "name": "logo 22.09.06.png", - "path": "/06/0e/060e09e1d67d8cc41869fc09ed1cd337d7b6e6d67699cc6ca2370773d10f2153.png" - }, - { - "name": "I'm Here, Waiting.mp3", - "path": "/ad/06/ad06666b861a2d971faaedfb8dcd6f7af556b49396b637ca33af48cd8bec1179.mp3" - } - ], - "content": "


\u23f2\ufe0f \u00a001 - 10 \u00a0\u23f2\ufe0f

01. 3 Minutes \u00a0||| \u00a002. The Tall Grave


\u00a003. The Moon Skeleton\u00a0\u00a0||| \u00a0\u00a004. The Wheel


05. The Speedrun \u00a0\u00a0||| \u00a0\u00a006. Nightly Prayer


07. My Dad's New Box \u00a0\u00a0||| \u00a0\u00a008. The Gnome


09. Fgnall \u00a0\u00a0||| \u00a0\u00a010. Naps on the Cliffside


\ud83c\udf32 \u00a011 - 23 \u00a0\ud83c\udf32

11. Thunk \u00a0\u00a0||| \u00a0 12. The Long Straw


13. The Surgery \u00a0\u00a0||| \u00a0\u00a014. Missing Buildings\u00a0


15. Flavored Water \u00a0\u00a0||| \u00a0\u00a016. The Memory Pawn Shop\u00a0


17. The Clause \u00a0\u00a0||| \u00a0\u00a018. The Upside Down Cloud


19. Reach \u00a0\u00a0||| \u00a0\u00a020. Hell


21. A Well Full of Marbles \u00a0\u00a0||| \u00a0\u00a022. Demolition


23. Patching
", - "edited": null, - "embed": {}, - "file": { - "name": "I'm Here, Waiting.mp3", - "path": "/ad/06/ad06666b861a2d971faaedfb8dcd6f7af556b49396b637ca33af48cd8bec1179.mp3" - }, - "id": "66689004", - "published": "Fri, 20 May 2022 23:23:16 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Archive ] Catalogue of Increasingly Normal Stories", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:06:03 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/6d/b6/6db61a6978520a448bb60aa03eb985a2d6d3eb5a01abc9a55c29dea8ff26c7cd.png" - }, - { - "name": "[ Audio Log ] - The Speedrun.mp3", - "path": "/e9/26/e9269ca490cde7192978e226d526c391ec81fb2b0c6ec4c9f0a6426c67590972.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

Where do we go next? Tough decision, I know. But rest assured at least, that wherever we go, we'll go together:

NIGHTLY PRAYER or THE GNOME?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Speedrun.mp3", - "path": "/e9/26/e9269ca490cde7192978e226d526c391ec81fb2b0c6ec4c9f0a6426c67590972.mp3" - }, - "id": "66646000", - "published": "Thu, 19 May 2022 22:12:36 GMT", - "service": "patreon", - "shared_file": false, - "title": "05. The Speedrun", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:06:45 GMT", - "attachments": [ - { - "name": "wood fairy.png", - "path": "/87/0f/870f88ff1a3b7bff52c2c0a268c76976b9c11dfc420ec5329254138e1765ca32.png" - } - ], - "content": "

... of a \"fairy\" in the woods, you kindly offered to look into it. You have to admit, you weren't expecting something quite so big.

Do you wanna my process for something like this? Lemme show you! Even though this doesn't have a whole lot of rendering, I still went through a few iterations.

Iteration 01. After this, I copied the layer, and continued working on the copy. This was actually originally gonna be a normal-sized guy just covered in leaves, but at the last second I thought \"what if a giant head\" and decided that that was scarier.

Iteration 02. Aside form the lighting changes (which a hue/saturation/brightness adjustment layer did most of the work on), I decided to make the pupils big instead of small. You know how when a cat is about to pounce, its pupils get really big?

Iteration 03, the final that you see up top. A little bit more leaves. Some darker areas (shadows right under trees), some lighter areas (additional yellow highlights on eyes). The last 10%. At this stage I'm always nervous that I'm gonna ruin it somehow, but like, balls to it. It's my drawing, I'll ruin it all I want lmao

", - "edited": null, - "embed": {}, - "file": { - "name": "wood fairy.png", - "path": "/87/0f/870f88ff1a3b7bff52c2c0a268c76976b9c11dfc420ec5329254138e1765ca32.png" - }, - "id": "66438173", - "published": "Sun, 15 May 2022 03:23:14 GMT", - "service": "patreon", - "shared_file": false, - "title": "When you heard about the sightings ...", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:07:04 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/92/34/92341ab63bbe21befe9ef79f942c77df99fda675c30ec00c296eaf7d89701e0f.png" - }, - { - "name": "[ Audio Log ] - The Wheel.mp3", - "path": "/dd/70/dd7018054f88a104ee0927feec7ad4a903906d5957170d8e96c79c6a995e8c23.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >


Ahead of you, the path diverges into two.


What will it be? The Speedrun or Nightly Prayer?

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Wheel.mp3", - "path": "/dd/70/dd7018054f88a104ee0927feec7ad4a903906d5957170d8e96c79c6a995e8c23.mp3" - }, - "id": "66382705", - "published": "Fri, 13 May 2022 16:20:30 GMT", - "service": "patreon", - "shared_file": false, - "title": "04. The Wheel", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:07:48 GMT", - "attachments": [], - "content": "

Oh, hello.

I see you've found yourself once again in my study of haunts. Were you surprised that the door you seemingly entered the manor through led you right back here? Hoho!

Well, I certainly wasn't. I've long been a denizen of this place, after all.

Anyhow, I'd like to offer you an opportunity, to choose your destiny ... and ask something of you too. Remember these?

I would like to declassify one of them, so that they may be viewed by the unsuspecting public. Which one should I declassify? The Moon Skeleton, 3 Minutes, or The Tall Grave? I'll leave some buttons and whatnot for you to decide below. Heaven knows, these newfangled personal computer machines, to me, are the greatest mystery of all.

Now, that's enough looking back. Time to look forward. Which of these stories would you like to hear next?

Decide carefully. For who knows. Whatever door you walk through here, may just be your last ....

.... but probably not ....

..... but maybe .....


", - "edited": null, - "embed": {}, - "file": {}, - "id": "66218736", - "published": "Mon, 09 May 2022 22:01:34 GMT", - "service": "patreon", - "shared_file": false, - "title": "Let's play a game.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:08:00 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/5d/9f/5d9fc73fdd374068246c9ce412b5b03adc313da4ded8e4336cae8515ff37f642.png" - }, - { - "name": "[ Audio Log ] - The Tall Grave.mp3", - "path": "/06/3d/063dd93cc58e52092884771590acf4c87e76d3993ff9537103cddd3f06f580e7.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - The Tall Grave.mp3", - "path": "/06/3d/063dd93cc58e52092884771590acf4c87e76d3993ff9537103cddd3f06f580e7.mp3" - }, - "id": "66063628", - "published": "Thu, 05 May 2022 23:47:39 GMT", - "service": "patreon", - "shared_file": false, - "title": "02. The Tall Grave", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:08:40 GMT", - "attachments": [ - { - "name": "1080 01.png", - "path": "/87/99/8799b683100c10d6d04891169db5de5fb67b5fc653a6f18b7a64893710eb36e0.png" - }, - { - "name": "[ Audio Log ] - 3 Minutes.mp3", - "path": "/17/39/1739da673fdba5cc4ea19048cf2aca40c65c819fa36eb504a00b38828fb8dcb4.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - 3 Minutes.mp3", - "path": "/17/39/1739da673fdba5cc4ea19048cf2aca40c65c819fa36eb504a00b38828fb8dcb4.mp3" - }, - "id": "65980003", - "published": "Wed, 04 May 2022 02:45:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "01. 3 Minutes", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:09:19 GMT", - "attachments": [ - { - "name": "1500 01.png", - "path": "/cd/59/cd59194c19125332b21490172baec3e64123070c4b94f2fa87896d3ce64e259c.png" - }, - { - "name": "[ Audio Log ] - Moon Skeleton.mp3", - "path": "/43/a6/43a6667c8d40ed0b16fd037047469b7f1f2832b6ba8b6f53729234b53121e0c9.mp3" - } - ], - "content": "

< PREV | \u25a4 ARCHIVE | NEXT >

< PREV | \u25a4 ARCHIVE | NEXT >

", - "edited": null, - "embed": {}, - "file": { - "name": "[ Audio Log ] - Moon Skeleton.mp3", - "path": "/43/a6/43a6667c8d40ed0b16fd037047469b7f1f2832b6ba8b6f53729234b53121e0c9.mp3" - }, - "id": "65911698", - "published": "Mon, 02 May 2022 17:37:33 GMT", - "service": "patreon", - "shared_file": false, - "title": "03. The Moon Skeleton", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:09:54 GMT", - "attachments": [ - { - "name": "Audio Log - ULTRABOOTMAN.mp3", - "path": "/99/97/9997c032c4ca190c3cb81313b9825ea1fa38a55a23d58930f4046786b0a8fbd9.mp3" - } - ], - "content": "


---


Check out the rest of the heroes at The Outliners instagram!

", - "edited": null, - "embed": {}, - "file": { - "name": "Audio Log - ULTRABOOTMAN.mp3", - "path": "/99/97/9997c032c4ca190c3cb81313b9825ea1fa38a55a23d58930f4046786b0a8fbd9.mp3" - }, - "id": "65731008", - "published": "Thu, 28 Apr 2022 19:52:12 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Late Access ] - ULTRABOOTMAN", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:10:56 GMT", - "attachments": [ - { - "name": "Audio Log - Buttons in the Dark 2.mp3", - "path": "/66/c6/66c6d95f71bc40c6a2dd56bbc034fbf87f590a7c7f95162c44495c2f1636476f.mp3" - } - ], - "content": "


", - "edited": null, - "embed": {}, - "file": { - "name": "Audio Log - Buttons in the Dark 2.mp3", - "path": "/66/c6/66c6d95f71bc40c6a2dd56bbc034fbf87f590a7c7f95162c44495c2f1636476f.mp3" - }, - "id": "65424136", - "published": "Thu, 21 Apr 2022 15:49:20 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Early Access ] - Buttons in the Dark ... V2!! (CW: blood)", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:11:38 GMT", - "attachments": [ - { - "name": "Audio Log - Buttons in the Dark.mp3", - "path": "/39/a8/39a84cb3443a64bef21f1f3ea9a043b7f8451a669dede69b638005e5285d9d75.mp3" - } - ], - "content": "


", - "edited": null, - "embed": {}, - "file": { - "name": "Audio Log - Buttons in the Dark.mp3", - "path": "/39/a8/39a84cb3443a64bef21f1f3ea9a043b7f8451a669dede69b638005e5285d9d75.mp3" - }, - "id": "65392885", - "published": "Wed, 20 Apr 2022 20:48:50 GMT", - "service": "patreon", - "shared_file": false, - "title": "[ Early Access ] - Buttons in the Dark", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:12:07 GMT", - "attachments": [], - "content": "

<< PREV | \u25a4 ARCHIVE

You purchase the \ud83d\udd25\ud83d\udd4a\ufe0f DIVINE \u2694\ufe0f GUNBLADEAXE \u2694\ufe0f of HELL\ud83d\udd4a\ufe0f\ud83d\udd25 for 30 gold.


Having sold his one thing, the frog closes his store.


He is free. He is going to go retire now. You have freed him.


But you can't retire. Not yet. You have a boss to fight.


You walk right into a ROOM MIMIC.


You take out the \ud83d\udd25\ud83d\udd4a\ufe0f Divine \u2694\ufe0f GunBladeAxe \u2694\ufe0f of Hell \ud83d\udd4a\ufe0f\ud83d\udd25 ...


Wanting nothing to do with that thing, the Room Mimic deposits you outside.


And there, at the end of a hallway made entirely of cement


You have found who you're looking for.


You've found the GREEN FRIEND. To make good on your promise, of course, you have to bring them to the fairy for calibration. Whether you do that immediately or wait a bit is up to you. We'll assume you can retrace your steps back out of Deephouse pretty easily.

---

Hey y'all, I'd like to take a break from creating EDEN. I'm just really tired, and between this, the new gacha thing, and Bluechair, my output of comics on social media has crawled to a standstill. So let's call this the end of Season 1. If EDEN is what you're here and you're out, absolutely no hard feelings, and if you wanna stick around, you'll be getting early access with commentary to all comics, and those of you in the gacha tier will be getting gacha rolls.

Thanks! \u270c\ufe0f

~ Shen\u00a0

", - "edited": null, - "embed": {}, - "file": {}, - "id": "65214407", - "published": "Sat, 16 Apr 2022 16:09:43 GMT", - "service": "patreon", - "shared_file": false, - "title": "EDEN { 47 }", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:12:38 GMT", - "attachments": [ - { - "name": "poster 2000.png", - "path": "/2a/f6/2af6b64c81c7f426f61ead38eee79f62eed56ad697b4d466288446ff3a67b295.png" - } - ], - "content": "

Will be live in like 20min @ https://www.twitch.tv/valdevia\u00a0

", - "edited": null, - "embed": {}, - "file": { - "name": "poster 2000.png", - "path": "/2a/f6/2af6b64c81c7f426f61ead38eee79f62eed56ad697b4d466288446ff3a67b295.png" - }, - "id": "64974747", - "published": "Sun, 10 Apr 2022 21:07:30 GMT", - "service": "patreon", - "shared_file": false, - "title": "I'm on a stream soon! Just a heads \u261d\ufe0f", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:13:45 GMT", - "attachments": [], - "content": "


", - "edited": null, - "embed": {}, - "file": {}, - "id": "64968926", - "published": "Sun, 10 Apr 2022 18:21:02 GMT", - "service": "patreon", - "shared_file": false, - "title": "What if Shen but girl.", - "user": "72813" - }, - { - "added": "Mon, 20 Feb 2023 20:13:52 GMT", - "attachments": [ - { - "name": "Secret Audio Log - Ass Kicking.mp3", - "path": "/13/9c/139c68f799aa1056f9be0bd5a5376059465284e975af3e60c8fa43b35da792bd.mp3" - } - ], - "content": "



", - "edited": null, - "embed": {}, - "file": { - "name": "Secret Audio Log - Ass Kicking.mp3", - "path": "/13/9c/139c68f799aa1056f9be0bd5a5376059465284e975af3e60c8fa43b35da792bd.mp3" - }, - "id": "64828106", - "published": "Thu, 07 Apr 2022 03:41:33 GMT", - "service": "patreon", - "shared_file": false, - "title": "NOW YOU'VE DONE IT.", - "user": "72813" - } -] diff --git a/testing/test_database.py b/testing/test_database.py deleted file mode 100644 index c768212..0000000 --- a/testing/test_database.py +++ /dev/null @@ -1,239 +0,0 @@ -"""Test file for database in models""" -import unittest -import sys -import os -from unittest.mock import patch, MagicMock -import threading -import json - - -# pylint: disable=C0411 - -sys.path.append('../') -from testing import local_constants - -import models.database_model as database -import constants - -class DatabaseTests(unittest.TestCase): - """Is a standard unittest module for the database in the database_model module""" - - @classmethod - def setUpClass(cls): - cls.database = database.Database() - - # sample user data - cls.databaseId = 72813 - cls.name = "na" - cls.service = "Patreon" - cls.checked_post_ids = [84905474, 84778099, 84238287, 83529449, 83343026, 83218897, 83169653, 83065295, 82276738, 82064413, 81954654, 81851518, 81209841, 81059547, 80704628, 80338946, 80190808, 79994633, 78434719, 77440488, 76755887, 75926672, 75710038, 75580104, 75157411, 75022239, 74916213, 74693973, 74245334, 74158934, 73468219, 73194386, 72942785, 72646675, 72467685, 72405353, 72310762, 72205399, 72091429, 72030404, 72001916, 71756991, 71677434, 71623437, 71380943, 71238640, 71182880, 71135747, 71087979, 71070581, 71062351, 70996043, 70943219, 70897713, 70853491, 70808920, 70769224, 70745940, 70716118, 70668831, 70668428, 70661972, 70605413, 70568003, 70527415, 70526592, 70489194, 70114372, 69844726, 69806320, 69437650, 69267254, 68972303, 68433820, 68341058, 68202290, 68113175, 68024574, 67908936, 67606882, 67436555, 67305910, 67104339, 66932176, 66803019, 66689004, 66646000, 66438173, 66382705, 66218736, 66063628, 65980003, 65911698, 65731008, 65424136, 65392885, 65214407, 64974747, 64968926, 64828106] - cls.unchecked_post_ids = [] - - cls.id_two = 645 - cls.id_one = 233 - - @classmethod - def tearDownClass(cls): - cls.database.close_all_connections() - if os.path.exists(constants.DATABASE_FILENAME): - os.remove(constants.DATABASE_FILENAME) - - - def test1_create_two_users(self): - """Run a test to create two uses in parallel. - Wanted to be parallel since the primary UI thread cannot be frozen. - """ - print("Creating 2 users") - - - - button_mock = MagicMock() - def create_test_user(user_id:int): - """Function to be called for the threading - - Args: - id (int): id to be passed in - """ - - self.database.create_user( - user_id, - self.service, - button_mock - ) - - with patch('input_panel.status_helper.set_user_operation_status_values'), \ - patch('urllib.request.urlopen') as mock_urlopen: - - # passing along the url to the PretendContext - mock_urlopen.side_effect = lambda url: PretendContext(url) - - print("Multithreading creation calls") - thread_1 = threading.Thread(target=create_test_user, args=(self.id_one,)) - - thread_2 = threading.Thread(target=create_test_user, args=(self.id_two,)) - thread_1.start() - thread_2.start() - - thread_2.join() - thread_1.join() - print("Joined, both users created") - - print("Testing malformed inputs") - with self.assertRaises(ValueError): - self.database.create_user("id","Pateron", button_mock) - with self.assertRaises(AssertionError): - self.database.create_user(5,"service", button_mock) - - - def test2_get_all_users_methods(self): - """Tests the get_all_users method and get_all_user_id_and_services - - Raises: - ValueError: In the case of unexpected/incorrect ids - """ - print("Testing if users were sucessfully added/ can get all users (and their objs)") - res = self.database.get_all_user_id_and_services() - - #checking values - self.assertEqual(len(res),2) - assert isinstance(res[0][0], int) - assert isinstance(res[0][1], str) - if res[0][0] not in [self.id_one, self.id_two]: - raise ValueError("the id is incorrect") - - res = self.database.get_all_user_obj() - self.assertEqual(len(res),2) - row_tuple_res_0 = res[0].get_as_row_tuple() - row_tuple_truth = (row_tuple_res_0[0], - #id value depends on which one was added first by multithreading, so needs to be set - self.name, - row_tuple_res_0[2], - self.service, - json.dumps(self.checked_post_ids), - json.dumps(self.unchecked_post_ids)) - assert row_tuple_res_0 == row_tuple_truth - - def test3_get_user_obj(self): - """Tests the get_user_obj function and thus does_user_exist since it calls get_user_obj - Also testing based on database id - """ - print("Testing if can get specific user and data") - res = self.database.get_user_obj(self.id_one, self.service) - row_tuple_res_0 = res.get_as_row_tuple() - row_tuple_truth = (row_tuple_res_0[0], - self.name, - self.id_one, - self.service, - json.dumps(self.checked_post_ids), - json.dumps(self.unchecked_post_ids)) - assert row_tuple_res_0 == row_tuple_truth - - res = self.database.get_user_from_database_id(self.databaseId) - assert row_tuple_res_0 == row_tuple_truth - - def test4_update_user_obj(self): - """Tests the update_user_obj using the manual input and object input - """ - print("Replacing/updating row based on database id and user object") - user_obj = self.database.get_user_obj(self.id_one, self.service) - - user_obj.checked_post_ids = [] - self.database.update_database_row_user_object(user_obj) - - user_obj = self.database.get_user_obj(self.id_one, self.service) - assert user_obj.checked_post_ids == [] - self.id_one = user_obj.id - - print("Updating without making a new user object") - self.database.update_database_row_manual_input(self.id_one, self.service, [1], [2]) - user_obj = self.database.get_user_obj(self.id_one, self.service) - - assert user_obj.checked_post_ids == [1] - assert user_obj.unchecked_post_ids == [2] - - print("Testing attempting to update a nonexisting object or other edge cases") - # nonexistant keys like database id, id, service - user_obj = self.database.get_user_obj(self.id_one, self.service) - user_obj.database_id = -1 - with self.assertRaises(AssertionError): - self.database.update_database_row_user_object(user_obj) - - with self.assertRaises(AssertionError): - self.database.update_database_row_manual_input(-1, self.service, [1], [2]) - with self.assertRaises(AssertionError): - self.database.update_database_row_manual_input(self.id_one, "service", [1], [2]) - - def test5_get_all_unknown_posts(self): - """Testing specific get all unkown posts function and services - """ - print("Testing getting all unknown posts") - self.database.update_database_row_manual_input(self.id_two, self.service, [1], [2,3,4]) - self.database.update_database_row_manual_input(self.id_one, self.service, [3], [1,3,5]) - - res = self.database.get_all_uknown_post_ids_and_service() - for post in res: - post = post.split(",") - post[0] = int(post[0]) - post[2] = int(post[2]) - - assert post[0] in [1,2,3,4,5], "Misread the unknown posts somehow?" - assert post[1] == self.service, "Wrong service" - assert post[2] in [self.id_one, self.id_two] - - - - def test6_know_all_unknown_posts(self): - """Making sure we can convert a known post into unknown, maybe should make other half - """ - print("Testing convert all unknown to known posts") - self.database.update_database_row_manual_input(self.id_two, self.service, [1], [2,3,4]) - self.database.know_unknown_post(self.id_two, self.service, 2) - self.database.know_unknown_post(self.id_two, self.service, 4) - - with self.assertRaises(KeyError): - self.database.know_unknown_post(self.id_two, self.service, 5) - assert self.database.get_user_obj(self.id_two, self.service).unchecked_post_ids == [3] - - @patch('input_panel.status_helper.set_user_operation_status_values') - def test7_delete_user(self, patch_status_helper): - """Tests deleting a user function - """ - print("Testing delete user") - self.database.delete_user(self.id_one, self.service) - assert self.database.get_user_obj(self.id_one, self.service) is None - - -class PretendContext: - """This is a fake context manager for urlopen, thus we can control what the result of - read is - """ - def __init__(self, url): - self.url = url - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - pass - - def read(self) -> bytes: - """A function to mock the api call. It takes in a url and returns different - bytes based on the input url. - - Returns: - bytes: output bytes based on what it theoretically should've - """ - if self.url.endswith("=0"): - with open(local_constants.USER1_FIRST_PAGE, 'rb') as file: - sample_api_bytes = file.read() - return sample_api_bytes - elif self.url.endswith("50"): - with open(local_constants.USER1_SECOND_PAGE, 'rb') as file: - sample_api_bytes = file.read() - return sample_api_bytes - else: - return b'{}' - -if __name__ == '__main__': - - unittest.main() diff --git a/testing/test_output_controller.py b/testing/test_output_controller.py deleted file mode 100644 index 7821a25..0000000 --- a/testing/test_output_controller.py +++ /dev/null @@ -1,161 +0,0 @@ -"Tests for the two primary functions of the output controller" -import unittest -import sys -from unittest.mock import patch, Mock, MagicMock -import string - -sys.path.append('../') -# pylint: disable=C0413 -from models.user_model import User -from output_panel import output_controller -from output_panel.output_controller import get_unseen_post_ids_from_page -from testing import local_constants -# pylint: enable=C0413 - -class OutputControllerTest(unittest.TestCase): - """Test for the output controller. Should mock any external modules - """ - - @patch('urllib.request.urlopen') - def test1_get_unseen_post_ids_from_page(self, urllib_mock): - """Test the specific get_unseen_post_ids by giving a fake set of inputs - and also mocking the api call returns. - We recreate situation where we check the first page and the user only has some checked ids - """ - print("Testing if we can process an api call and get new ones") - request = "https://kemono.party/api/" + local_constants.USER1_SERVICE + \ - "/user/" + str(local_constants.USER1_ID) + "?o=" - - with open(local_constants.USER1_FIRST_PAGE, 'rb') as file: - entire_first_page_bytes = file.read() - - url_to_response_data = { - request+"0": entire_first_page_bytes, - request+"50": b"[]\n" - } - - # returning a mock to handle the read call - # enter/exit required due to the with as statement - def urlopen_side_effect(url, *args, **kwargs): - mock_response = MagicMock() - - mock_response.__enter__.return_value = mock_response - mock_response.__exit__.return_value = False - mock_response.read.return_value = url_to_response_data.get(url) - - return mock_response - urllib_mock.side_effect = urlopen_side_effect - - api_index = 0 - # Using second half of the first page bc logically unseen content is probably new - known = local_constants.USER1_SECOND_HALF_POST_IDS[3:5] - unknown = local_constants.USER1_SECOND_HALF_POST_IDS[5:] - unseen = local_constants.USER1_SECOND_HALF_POST_IDS[:3] - - new_unseen = get_unseen_post_ids_from_page(request+str(api_index), - known, unknown, unseen) - - # type checking - assert isinstance(new_unseen, list) - assert isinstance(new_unseen[0], int) - - all_posts = known + unknown + unseen + new_unseen - all_posts.sort() - all_posts.reverse() - - assert all_posts == local_constants.USER1_FIRST_PAGE_IDS - assert len(known) + len(unknown) + len(unseen) + len(new_unseen) == 50 - - # testing the empty case - api_index += 50 - new_unseen = get_unseen_post_ids_from_page(request+str(api_index), - known, unknown, unseen) - assert not new_unseen - - @patch("models.database_model.Database") - @patch("input_panel.status_helper.set_get_updates_status_label_values") - @patch("tkinter.Button") - @patch('output_panel.output_controller.get_unseen_post_ids_from_page') - - def test2_get_unseen_posts_thread(self, - mock_get_unseen_post_ids, - mock_button, - mock_status_helper, - mock_database): - """ Mocks the unseen posts, need to mock tons of external variable calls - """ - print("Testing getting unseen post ids through database and api calls") - # setup some extranous mocks that we may need - output_controller.pass_vars(Mock(), mock_button, mock_database) - update_user_data_mock = Mock() - mock_database.update_database_row_manual_input = update_user_data_mock - - # setup user1 data, seen/unseen/unknown variables - user1_first_page = local_constants.USER1_FIRST_PAGE_IDS - user1_first_page_unseen = [user1_first_page.pop(3)] - user1_second_page = local_constants.USER1_SECOND_PAGE_IDS - user1_second_page_unseen = [user1_second_page.pop(3)] - - user1_known = user1_first_page[5:] + user1_second_page[5:] - user1_unknown = user1_first_page[:5] + user1_second_page[:5] - user_obj_1 = User( - 1, - local_constants.USER1_NAME, - local_constants.USER1_ID, - local_constants.USER1_SERVICE, - user1_known, - user1_unknown, - ) - - user2_first_page = local_constants.USER2_FIRST_PAGE_IDS - user2_first_page_unseen = [user2_first_page.pop(3)] - - user2_known = user2_first_page[:5] - user2_unknown = user2_first_page[5:] - user_obj_2 = User( - 1, - local_constants.USER2_NAME, - local_constants.USER2_ID, - local_constants.USER2_SERVICE, - user2_known, - user2_unknown, - ) - mock_database.get_all_user_obj.return_value = [user_obj_1, user_obj_2] - - # we mock the result of this function call and just return as if this function works - def mock_get_unseen_post_ids_side_effect(request: string, - known_ids: list, - unknown_ids: list, - unseen_ids: list): - if request == "https://kemono.party/api/" + local_constants.USER1_SERVICE + \ - "/user/" + str(local_constants.USER1_ID) + "?o=0": - return user1_first_page_unseen - if request == "https://kemono.party/api/" + local_constants.USER1_SERVICE + \ - "/user/" + str(local_constants.USER1_ID) + "?o=50": - return user1_second_page_unseen - if request == "https://kemono.party/api/" + local_constants.USER2_SERVICE + \ - "/user/" + str(local_constants.USER2_ID) + "?o=0": - return user2_first_page_unseen - return [] - mock_get_unseen_post_ids.side_effect = mock_get_unseen_post_ids_side_effect - - output_controller.get_unread_posts_thread() - - user_1_sorted_unknown = user1_unknown + user1_first_page_unseen + user1_second_page_unseen - user_1_sorted_unknown.sort() - user_2_sorted_unknown = user2_unknown + user2_first_page_unseen - user_2_sorted_unknown.sort() - - expected_calls = [ - (local_constants.USER1_ID, - local_constants.USER1_SERVICE, - user1_known, - user_1_sorted_unknown), - (local_constants.USER2_ID, - local_constants.USER2_SERVICE, - user2_known, - user_2_sorted_unknown) - ] - - actual_calls = list(call_args[0] for call_args in update_user_data_mock.call_args_list) - assert expected_calls == actual_calls diff --git a/testing/test_user.py b/testing/test_user.py deleted file mode 100644 index 4e2a8a5..0000000 --- a/testing/test_user.py +++ /dev/null @@ -1,60 +0,0 @@ -""" Tests for the user model""" -import unittest -import sys -import json - -sys.path.append('../') - -from models import user_model - -#python -m unittest userTest.py -class UserTests(unittest.TestCase): - """Test class for user - - Args: - unittest (_type_): standard input - """ - - def setUp(self): - """ Provides hardcoded data for a user - """ - self.database_id = 2 - self.name = "yellow" - self.id = "2234" - self.service = "Patreon" - self.checked_post_ids = [1,5,4,6,75] - self.unchecked_post_ids = [2,3,7,99] - - self.user = user_model.User(self.database_id, - self.name, - self.id, - self.service, - self.checked_post_ids, - self.unchecked_post_ids) - - self.assertEqual(self.user.database_id, self.database_id) - self.assertEqual(self.user.name, self.name) - - - def test1_get_as_row_tuple(self): - """simple hardcodes a expected uple for the user data set in setUp - """ - tuple_results = self.user.get_as_row_tuple() - tuple_truth = (self.database_id, - self.name, - self.id, - self.service, - json.dumps(self.checked_post_ids), - json.dumps(self.unchecked_post_ids)) - - self.assertEqual(tuple_results, tuple_truth) - - def test2_convert_row_to_user(self): - """Depends on test1 being accurate since it uses get_as_row_tuple function - """ - tuple_results = self.user.get_as_row_tuple() - user_result = user_model.convert_row_to_user(tuple_results) - - assert isinstance(self.user, user_model.User) - self.assertEqual(self.user.database_id, user_result.database_id) - self.assertEqual(self.user.name, user_result.name)