#๐ JSON Saving makes no sense.
1622 messages ยท Page 2 of 2 (latest)
But it's inherently a number
btw golf
i will fix it later, i have so many refactoring to do
ya think going down this route to eventually show him dataclasses is good ? 
i will apply everything that ive learnt
ehhh, making dataclasses work with json is pretty annoying
im not only working with json
nah u can just dataclass(**json) if u do it properly 
You can't nest that
If you want something robust you need to hook into json.load/json.save directly
dataclassesa are that 0.1% of calssess that you said i havent learnt yet?
part of it ig
im searching them up
remember that inventory class example i showed ?
yes
the Item class could have been a dataclass
as an example
since all its doing is holding data
.
!e
from dataclasses import dataclass
@dataclass
class Item:
name: str
count: int
class Inventory:
def __init__(self):
self.items = []
def add_item(self, item, count):
new_item = Item(item, count)
self.items.append(new_item)
def remove_item(self, name, count):
for item in self.items:
if item.name == name:
item.count -= count
inv = Inventory()
inv.add_item("log", 99)
print(inv.items[0])
inv.remove_item("log", 10)
print(inv.items[0])
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | Item(name='log', count=99)
002 | Item(name='log', count=89)
since all its doing is holding data, this is much simpler 
yk
i have additional logic for removing, adding etc..
this dosent cut it, but still, im looking into it
might need some time
u got all the time in the world
dont rush it

i never rush things
i recommend a Player class btw

for only inventory functions? or any other thing?
for anything player related
u said this multiplayer
the whole game is player related
every action either removes something from p.json or adds
its constntly getting edited
they do
thats why player.json is not called player.json
its called UUID.json
uuid replaced with the players id
like this
class Player:
def __init__(self):
self.UUID = ...
self.inventory = Inventory()
def gather_fish(self):
# do fishing action here
this what i mean

just organizes every Player related thing there so its easier and simpler
what is inventory()
some inventory class
like one i showed u as an example
inventory classes are very useful cause they can be a player inventory or a chest inventory or a backpack inventory
doesnt matter
its an inventory

i have coded the logic for gathering wood and stone, do you want to see them to get a better understanding of what they are and how they work?
mhm yes
i havent made fish yet
yes sorry didnt see the rest of the message mb
sure ig ?
k
import random
from data import loadJson, loadPlayerData, saveJson
from inventory import inventoryActionHandler
gathers = loadJson("gathers.json")
def rollChance(num):
if isinstance(num, int):
roll = random.randint(0, 100)
elif isinstance(num, float):
roll = random.uniform(0, 100)
return roll <= num
def numberRandomizer(num1, num2):
return random.randint(num1, num2)
def weightRandomizer(dicts):
items = list(dicts.keys())
weights = list(dicts.values())
selected = random.choices(items, weights)[0]
return selected
def extractWeights(gather):
weights = {}
for mats, datas in gathers[gather].items():
weight = float(datas['weight'])
weights[mats] = weight
return weights
def damageGather(player, gather):
data = loadPlayerData(player)
data2 = data["gather"][gather]
material = list(data2.keys())[0]
health = int(list(data2.values())[0])
damage = 4
while damage > 0:
print(material)
print(health)
print(damage)
if damage <= health:
health -= damage
damage = 0
data["gather"][gather] = {material: str(health)}
saveJson((f"{player}.json"), data)
else:
damage -= health
health = 0
giveDrops(player, gather, material)
print('gave drops!')
material, health = generateGather(gather)
def generateGather(gather):
material = weightRandomizer(extractWeights(gather))
matdata = gathers[gather][material]
health = int(matdata["damage"])
icon = matdata["icon"]
return material, health
def giveDrops(player, gather, material):
drops = gathers[gather][material]["drops"]
for item, details in drops.items():
if rollChance(details.get("chance")):
quantity = numberRandomizer(details.get("min"), details.get("max"))
inventoryActionHandler("add", player, "inventory", item, quantity)```
it starts at damageGather
{
"foraging": {
"deciduous": {
"icon": "๐ณ",
"weight": "0.6",
"damage": "34",
"drops": {
"log": {
"min": 2,
"max": 3,
"chance": 100
},
"green leaves": {
"min": 2,
"max": 5,
"chance": 100
}
}
},"palm": {
"icon": "๐ด",
"weight": "0.3",
"damage": "36",
"drops": {
"log": {
"min": 3,
"max": 5,
"chance": 100
},
"green leaves": {
"min": 1,
"max": 3,
"chance": 80
}
}
},"pine": {
"icon": "๐ฒ",
"weight": "0.1",
"damage": "42",
"drops": {
"log": {
"min": 4,
"max": 6,
"chance": 100
},
"green leaves": {
"min": 4,
"max": 7,
"chance": 100
}
}
}
},
"mine": {}
}
this is gathers.json mentioned in the code above
red = could be simplified by a Player class, blue = could be majorly simplified by a Material class

i see
just have a material have its own health, damage(), get_drops(), etc.
and inside generate_gather just make a new material using said class
also im hella confused
why is ur material health named damage
in this json
its called dmg in json, but its health basically
i will
dmg attribute is on item
damage calculations can get quite hectic
ye that works too
i wont use float
have item that player is holding on player class
and just reference player.held_item.dmg
or something

yes will do that
i use paper
works too
useful
ive learnt so much today
is there anything else to learn? ๐
i better say is there anything else you'd like to teach me?
inheritance is useful
i showed u a quick example dont know if u recall

its like making a class inside a class and making the child class borrow methods from the parent class?
(as far as ive red)
what i meant was
class parent:
class child(parent):
this doesnt make a class inside a class but basically ye, everything parent has, the child has
if u want a quick useful example of this
yes, didnt mean to write"inside"
imagine u got a base item class thats just like name and count
now we can make a class tool that inherits from item
change being it now has a damage attribute too
cool ? 
ye
im getting the hang of it'
also if parent has lets say def some_method()
if child also implements that
it overrides
u can still call the parent's method but it would be done manually
a function inside a class is called a method, asking to make sure
!e
class Parent:
def a(self):
print(4)
class Child(Parent):
def a(self):
print(5)
c = Child()
c.a()
:white_check_mark: Your 3.12 eval job has completed with return code 0.
5
understood
!e
class Parent:
def a(self):
print(4)
class Child(Parent):
def a(self):
super().a()
print(5)
c = Child()
c.a()
:white_check_mark: Your 3.12 eval job has completed with return code 0.
001 | 4
002 | 5
and if Child didnt have a method it would just use the parent's which in this case is Parent
a way to dynamically access a parent class
ah, you call the a in parent with super
super() in this case would be Parent yes
understood
just fyi super is in that part of "dont worry about how it works, it works like this"
so let this simple usage and demonstration of super() be what u know

?
def damageGather(player, gather):
data = loadPlayerData(player)
data2 = data["gather"][gather]
material = list(data2.keys())[0]
health = int(list(data2.values())[0])
damage = 4
while damage > 0:
print(material)
print(health)
print(damage)
if damage <= health:
health -= damage
damage = 0
data["gather"][gather] = {material: str(health)}
saveJson((f"{player}.json"), data)
else:
damage -= health
health = 0
giveDrops(player, gather, material)
print('gave drops!')
material, health = generateGather(gather)```
remember this, it created the "revert" jsonsave bug
because we used savejson twice
now, if i use my new save class that saves data
wont i still run into the same bug?
sure its saving one time, but its saving 2 different datas at the same time
one data for ["storage]["inventory]
one for ["gather
depends
did u change save change save
or did u change change save
by this you mean rewriting the hwole thing?
ah
youre refering to the order
change change save
alright
unless u assigned stuff and overwrote it that way
i was resting till now, ima go write the data class or something
can i get a quick tip on how to orgenise my classes
by that i mean, you mentioned a player and another inventory class
if the inventory class is for inventory stuff
then what is the player one for
for player stuff
if player starts fishing minigame
call go_fish method on that player object
good idea
player catches a fish during that ? great
now add fish to that player object inventory
great
fish rotted ? well shit, lets remove that fish from that player object inventory cause it stinks
u get idea hopefully
so, datasaving/loading class should be seprate from inventory
๐ good one
i would have that kind of stuff as an utility class rather than imbued into player/inventory
utility class?
maybe a wrapper or decorator for player/inventory to be able to more easily use it
a class whose sole purpose is to provide utility
in this case saving/loading to/from json
in my utils of current project i just have this thing
def splice_byte_data(data, sizes, shift = 0):
index = 0
spliced = []
for size in sizes:
new_index = index + size
spliced.append(data[shift + index:shift + new_index])
index = new_index
return spliced
for example
its just nice to have to not need to remake it everywhere ya know

i guess this is my entire player data loading and saving class
and an object of that could just be shoved onto player class

yes
you mean like
player(self.data)?
something like this?
have we passed it yet?
what was the other thread like?
class Player:
def __init__(self):
self.playerdata = Playerdata()
~1566
literally 2 off
im struggling to find the right way of using classess, after making them.
#saveJson((f"{player}.json"), data)
(PlayerData((f"{player}.json"), data)).save()
i replaced the line above, with the one below it
u wanna shove the created playerdata object into a variable
then call .save() on that variable
here is another example of how u would do it
im just asking if i did it right or not
well whats data u passing to it ?
def inventoryActionHandler(action, player, storage, item, quantity):
data = (PlayerData(player)).load()
path = data["storage"][storage]
if action == 'add':
addItem(path, item, quantity)
elif action == 'remove':
removeItem(path, item, quantity)
elif action == 'craft':
craft_item(path, item, quantity)
data["storage"][storage] = path
#saveJson((f"{player}.json"), data)
(PlayerData((f"{player}.json"), data)).save()
i know i did the loading part wrong, ignore that
fixed it
it didnt have .load()
u could have done data.load() in line right under it
saving is the same logic
just .save() rather than .load()
waht im trying to get u to understand is that we only need to create 1 object here 
def inventoryActionHandler(action, player, storage, item, quantity):
playerdata = PlayerData(player) # this is good
playerdata.load() # now its loaded
path = playerdata.data["storage"][storage] # and data insdie it can be used since its loaded
if action == 'add':
addItem(path, item, quantity)
elif action == 'remove':
removeItem(path, item, quantity)
elif action == 'craft':
craft_item(path, item, quantity)
data["storage"][storage] = path # now here we would want to set data inside data variable then save
#saveJson((f"{player}.json"), data)
(PlayerData((f"{player}.json"), data)).save()
yes i understood
its because u did playerdata["storage"]
playerdata being the object of Playerdata class u wrote
yes i realized, but keep explaining
we want to do ["storage"] on actual data
not the object itself
the data should be inside the object
just a matter of accessing it
used your code
File "C:\Users\R\Desktop\New folder\gather.py", line 48, in damageGather
data["gather"][gather] = {material: str(health)}
^^^^
NameError: name 'data' is not defined. Did you mean: 'datas'?
wait its not the same part, still tho
yes ik 
point was showcasing how first 3 lines are done
and pointing out how to fix 4
so
and completely ignoring bottom 2 for now
datas.data
what is code u have rn
im gonna try fixing it myself
also fair
because i created 2 objects and i know i shouldnt do that
<data.PlayerData object at 0x000001BAE6E53050>
The file '1129110869.json' already exists.
<data.PlayerData object at 0x000001BAE72B0D60>
but i dont know how to make it 1 object
def damageGather(player, gather):
datas = PlayerData(player)
datas.load()
data2 = datas.data["gather"][gather]
material = list(data2.keys())[0]
health = int(list(data2.values())[0])
damage = 4
while damage > 0:
print(material)
print(health)
print(damage)
if damage <= health:
health -= damage
damage = 0
datas.data["gather"][gather] = {material: str(health)}
(PlayerData((f"{player}.json"), datas.data)).save()
else:
damage -= health
health = 0
giveDrops(player, gather, material)
print('gave drops!')
material, health = generateGather(gather)
(PlayerData((f"{player}.json"), datas.data)).save()
this line is sole issue
everything else is good 
whats our playerdata object here ?
i removed it, now the whole thing broke and dosent work
u mean it doesnt work or doesnt run
cause it should run 
.
its very simple]
use that objetc u made to save
rather than creating a new one
how can i catch it
wdym catch it
do i need to use like the obj id that looks like this?
<data.PlayerData object at 0x000001BAE6E53050>
what im thinking is that i need to use the id
so the var datas
def inventoryActionHandler(action, player, storage, item, quantity):
datas = PlayerData(player)
datas.load()
print(datas)
path = datas.data["storage"][storage]
if action == 'add':
addItem(path, item, quantity)
elif action == 'remove':
removeItem(path, item, quantity)
elif action == 'craft':
craft_item(path, item, quantity)
datas.data["storage"][storage] = path
#saveJson((f"{player}.json"), data)
(PlayerData((f"{player}.json"), datas.data)).save()```
its named datas in both places, how can i make it use the same obj? cant think of any other way
yes because i dont really know how to use the same obj in two different functions
i think i figured, lets see
did that in both places seprately, didnt work
did it error ?
yes
what is error then ?
OSError: [WinError 6] The handle is invalid
heres traceback
Traceback (most recent call last):
File "C:\Users\R\AppData\Local\Programs\Python\Python313\Lib\site-packages\telethon\client\updates.py", line 570, in _dispatch_update
await callback(event)
File "C:\Users\R\Desktop\New folder\main.py", line 39, in callback
damageGather(sender, "foraging")
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "C:\Users\R\Desktop\New folder\gather.py", line 47, in damageGather
datas.save()
~~~~~~~~~~^^
File "C:\Users\R\Desktop\New folder\data.py", line 27, in save
saveJson(self.player, self.data)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\R\Desktop\New folder\data.py", line 7, in saveJson
with open(name, "w") as file:
~~~~^^^^^^^^^^^```
i always lose it high above
no worries, ask me anytime
import json
def loadJson(name):
with open(name, "r", encoding='utf-8') as file:
return json.load(file)
def saveJson(name, data):
with open(name, "w") as file:
json.dump(data, file, indent=4)
class PlayerData:
def __init__(self, player, data=None):
self.player = player
self.data = data
def load(self):
inv_file = f"{self.player}.json"
preset = loadJson("inv.json")
try:
with open(inv_file, 'x') as file:
json.dump(preset, file, indent=4)
print(f"The file '{inv_file}' has been created.")
except FileExistsError:
print(f"The file '{inv_file}' already exists.")
self.data = loadJson(inv_file)
def save(self):
saveJson(self.player, self.data)
in load u using f"{self.player}.json" for file but in save only self.player
why ?

it still saves
but only if u have self.player as a valid .json filename
which then it wont load
cause it would be .json.json
but it still loads
but only if u have just filename
which then it wont save
cause it wouldnt be .json
im getting this "but it still loads" and "it still saves" from it working, but with the revert bug
which means it both loads and saves
use the code that produced this
but change class
but is it saving to the same file it's loading from?
oh hi
hi
yes
I'm back from doing homework lol
should i remove the .json or add another.json to save method
well lets think, which is a valid json file ? 
what does self.player contain?
name.json or just name
an uuid
name.json
so btw these 2 options ? 
if it already contains the .json then use it directly
if it doesn't, add it with the fstring (or other methods)
it just got rid of this error, revert bug remains(i saved once)
so show how u saving 
datas = PlayerData(player)
datas.load()
data2 = datas.data["gather"][gather]
material = list(data2.keys())[0]
health = int(list(data2.values())[0])
damage = 4
while damage > 0:
print(material)
print(health)
print(damage)
if damage <= health:
health -= damage
damage = 0
datas.data["gather"][gather] = {material: str(health)}
datas.save()
else:
damage -= health
health = 0
giveDrops(player, gather, material)
print('gave drops!')
material, health = generateGather(gather)```
Hey @inland atlas!
Add a py after the three backticks.
```py
print('Hello, world!')
```
This will result in the following:
print('Hello, world!')```
inventoryAction dosent have a save, as you said.
that probably means self.player is not a string
its an uuid as i mentioned 
wait why ur uuid an int i just realized
oh, I thought you meant a UUID string
ye nah my bad idk why i thought an int uuid was normal
I mean, it's just a 128bit number
it has to be, im using another app to authorize players, and it only has int uuids + its easier for me
fair
in that case I would at least convert it to a hex string
it needs to be the number it is, easier for me to edit code
for the save file, I mean
hex uuid .json you mean?
yeah
thats exactly why i want it to be int
something like f"{self.player:016x}.json" off the top of my head
I'm not talking about self.player itself
let me explain why i put 1 save in invAction and one in damageGathers
i can just do str()
can u show invaction function thats also saving
you also need the .json file extension
def inventoryActionHandler(action, player, storage, item, quantity):
datas = PlayerData(player)
datas.load()
print(datas)
path = datas.data["storage"][storage]
if action == 'add':
addItem(path, item, quantity)
elif action == 'remove':
removeItem(path, item, quantity)
elif action == 'craft':
craft_item(path, item, quantity)
datas.data["storage"][storage] = path
#saveJson((f"{player}.json"), data)
#(PlayerData((f"{player}.json"), datas.data)).save()```
invActioon
the invaction saves the drops you get from making a trees health down to 0
thats why it needs a save
so invaction is calling damagegather ?
and the other save in damageGather saves the players progression on how much dmg they have dealth to the current tree
reverse
dmg is calling inv
let me show u full code
def damageGather(player, gather):
datas = PlayerData(player)
datas.load()
data2 = datas.data["gather"][gather]
material = list(data2.keys())[0]
health = int(list(data2.values())[0])
damage = 4
while damage > 0:
print(material)
print(health)
print(damage)
if damage <= health:
health -= damage
damage = 0
datas.data["gather"][gather] = {material: str(health)}
datas.save()
else:
damage -= health
health = 0
giveDrops(player, gather, material)
print('gave drops!')
material, health = generateGather(gather)
def generateGather(gather):
material = weightRandomizer(extractWeights(gather))
matdata = gathers[gather][material]
health = int(matdata["damage"])
icon = matdata["icon"]
return material, health
def giveDrops(player, gather, material):
drops = gathers[gather][material]["drops"]
for item, details in drops.items():
if rollChance(details.get("chance")):
quantity = numberRandomizer(details.get("min"), details.get("max"))
inventoryActionHandler("add", player, "inventory", item, quantity)```
see giveDrops
that calls invaction
givedrops is called by dmg
this would be so much simpler with an inventory/player class
uh
time to stare at this
its easy dont worry
this is gathers var in the code above
this is the full code
i love how we are still on the exact topic that this thread was made for, 1400messages later.
cause u dont have it all on classes so u got this loopy weird function ping pong volleyball going on
you see gmt-3
just minus your time by 3 hours, u get utc time
for me, i need to minus it by 3:30 hours
that easy.
how is the future
dagger im going to start refactoring the inventory functions to class methods, also im going to make my inventory slots turn into lists, do you have any other suggestions before i start this? i dont want to miss anything
the future? i have made an inventory class in the future
refactor ur json to use an array and stop doing "0" just do 0 in there
just like in start of thread
.
in my game, you start with 5 inv-slots, then you get 2 sets of 5 later, will not putting numbers as keys for slots make any potential problems?(havent really worked with lists much)
in lists the first item in them is index 0
2nd is index 1
etc.
so it just equates to what u had before
and 6 would give out of range error if im not wrong
if u there is nothing at that index ye
althought u can keep adding to lists indefinetly
so to make a limit of 5 u would need to keep track of how much u add in inventory class

i have some functions(like sum, findemptyslot) that are used by main functions like addItem, removeItem etc.. do you recommend i put them inside the inventory class or outside? they are only used by big functions that are inside inventory class
.
since its inventory logic stuff
it goes inside inventory class

shrimple as that
ik, still worth asking
ofc ye
since i dont want to miss anything
do you think that child classess will be necessary here?
for items ye prob
cause u can have all sorts of them
i dont really have an image on how to use child classess
tools, guns, swords, etc. 
theres really no "sorts" of items
imagine parent is iphone12 and child is iphone13
same old shit but 1 extra camera
they are all just "items"
yup but each differ slightly enough to warrant their own class that is a child of item
tools have harvest damage which guns and swords might not
example of an item in items.json
{
"stone": {
"icon": "๐ชจ",
"type": "1"
},
type determines its stackibility
yes, i guess what you mean is, the child class should fetch items.json, and return any items that have attr dmg or something, right?
like
imagine we just have an item class
all it has is icon name quantity etc.
now lets say we want to make a tool
uh oh, item class doesnt have a damage durability or anything like that
but its still an item
so we make a tool class inheriting from item
that adds all that stuff a tool might need
why dont we just put all of those stuff in item class
do all items no matter what need damage durability and watever else a tool need s?
do u need a leaf to be able to harvest resources ?

its like
{
"stone": {
"icon": "๐ชจ",
"type": "1"
},
"sword": {
"icon": "๐ก",
"type": "0"
"dmg": "3"
},
stone dosent have dmg so it wont be in tools/weapons category
so type 1 here would be just base item class and type 0 would be a tools/weapon child class inheriting from item
type 1 stackable
type 0 unstackable
the only difference is that sword has a dmg attr
but not all items need a dmg attr do they ?
or better yet
from dataclasses import dataclass
@dataclass
class Item:
name: str
quantity: int
icon: str
stackable: bool = True
@dataclass
class Weapon(Item):
damage: int
stackable: bool = False
some_stone = Item("stone", 0, ๐ชจ)
a_sword = Weapon("excalibur", 1, :sword:, 3)

what is that @ thingy
decorators
here we go again
they are a whole can of worms that would go on for 500 messages
i have heard of them
for now just accept this how u do dataclasses which are a very clean way to do classes that hold data

they modify a function or class to do a certain thing without modifying the function or class
i can write it without the decorator if u want
how much improvement does decorator add
nvm i understood how decorators work
its like a wrapper
class Item:
def __init__(name, quantity, icon):
self.name = name
self.quantity = quantity
self.icon = icon
class Weapon(Item):
def __init__(name, quantity, icon, damage):
super().__init__(name, quantity, icon)
self.damage = damage
some_stone = Item("stone", 0, ๐ชจ)
a_sword = Weapon("excalibur", 1, :sword:, 3)
wraps a function/class around a function/class
dataclass autogenerates init for u based on the data u wrote
its p cool
but they are a bit more advanced ye
yea
trying to understand it rn
understood
such a hazard to rewrite
which is why u should plan before writing
i never do that and just accept the eternal rewrite fate
ive seen you put data = 0 instead of just data in DataLoader class, whys that?
๐
u mean inside init ?
thats so if data isnt given
it has a default value of 0
for playerdata u can use this so that data is the inv.json contents by default
and save a whole bunch of logic

hmmm
for all inventory methods
im passing inventory, item, quantity
but im not passing player

nvm
theres instances that for example, i want to add 10 different items at the same time, but running Class inventory isnt efficient, because that will be 10 loads, 10 saves
does class have this functionality to run it 10 times but make it actually run 1 time
weird question, im really unbraining rn
really close
uh
def some_method_for_one_item(item):
# watever here ?
# call this one with a list of 10 things u want done
def some_method(items):
for item in items:
some_method_for_one_item(item)
# save after its done looping or something idk

embrassing how easy it is
my brain really dosent work i need some rest
sorry
im resting right now and trying to fully understand everything that ive learnt today
there is so many changes that ill have to make
i kinda have to re write everything
the whole inventory functions took my like 4-5 days ( im bad at math + i didnt know how to use json in python )
atleast were close to your new record on thread with most messages that you have been a part of
resting is good
welcome to refactors
they usually suck

ive had multiple refactors before
but they were just vars, or if/elifs
or simple functions
ive never had complicated functions with classes
which is why this is gonna be a great learning experience
yea
yes
Holy fuck this posts has a lot of messages respect dagger
there was another one with like 1566 messages 
sometimes they just happen
really respect dagger
Can it be closed now with
!close
i dont want to close it
Get good sleep
some useful tips were classes, dunders and decoratoes
Ehh too much is also bad lol
You know oop?
Ok good not gonna read that back on my Phone tho ๐คช
dagger congrats on ur new record
ig just project structure ? 
๐
ye project structure sounds correct
OOP?
It's still on?๐ฅด
but more so how to structure ur folders and files so that its sane
yes lmmao
I think it's been ~8h
What did you do today ๐
Nope
It will close 1h after no one speak
im talking about reviewing it later
Oh yes
ye it will be there
You can, I recommend you copy a link tho
u just might have to search for it
mhm
i recommend u use .bm rather than link copying
Or that
!e
print('this was hell of a adventure')
:white_check_mark: Your 3.12 eval job has completed with return code 0.
this was hell of a adventure
i have so much brainfog that i dont even know what youre talking about
so u in the fun zone
not so fun zone
Items
L __init__.py
L BasicItem.py
L BasicWeapon.py
im talking about this kind of package

Take some weed
im 2
Sure bud
resting
will rest for an hour
then proceed to write class inventory
anyways
i dont know how to thank dagger
ima go rest
cya yall in 1~ hr ish
1610 messages 
You just bump it, welp
has to be kept alive somehow
almost 10h of goodness
he did say we was gonna be back in here 
Ye ik
how is it going over there ? 
Noo let the post die
i was gonna let it die if guy didnt respond but u just bumped it
But you tagged him :/
This help channel has been closed. Feel free to create a new post in #1035199133436354600. To maximize your chances of getting a response, check out this guide on asking good questions.