#development
1 messages · Page 1439 of 1
Yep there is a lot
Are you using SQL?
I'm sure you know what you're doing; however, 8 just seems a little unnecessary
those 8 things, whatever they are, could still be made into a transaction, if not further combined using JOINs
I was going to say this.
ORMs can be limited with their transaction / join abilities though.
lmao I feel uneducated when I see these database terms
I mean the bot has to check if every message is either an automod config
Ofc we have put checks in place if the automod is off we return None
Sounds like a join operation 🤔
always cache hot data
orm is basically never seeing an sql statement ever again
Yea one our devs implementing redis since we kinda need it
100000%
ok ive got to go cya guys
im happy with my sqlite xD
hahah
Is there an FAQ for badges, here?
"Certified Developer" sounds interesting lol
Roles I should say, I guess.
the certified program is currently not available
for caching things in memory, without redis, would you cache as a global or how would you make sure you can access it everywhere
not sure it if was removed completely or if they plan to bring it back at some point
i got it like 2 years ago
either as a global, or attached to a class instance you use everywhere
I leverage a sdk named keyv. It can be used as a caching engine in-memory (globally, as you say), or used with a plugin for other mediums (redis, memcache, etc)
i'd follow OOP conventions, create a class that acts as a service and the class contains a dictionary/map as a cache
Cache, in this case, would probably be a singleton.
yup
i usually attach my caches to the main class that runs the entire program
Exactly, a singleton.
Just 1 instantiation of the object for cache that the entire program consumes?
ye, also contains all methods
Sweet.
and access to subclasses
I feel like that's the best way, imo.
i do it like client.app = new MyClass() then client.app.getUser(id) for example
If you guys haven't used Docker, I would highly recommend it. It makes for destroying/updating/coupling with cache really easy.
Lmao for the program I plan to work on caching for I don’t use classes
im not planning on dockerizing anytime soon
It's definitely not a requirement.
Just makes things easier, for me personally.
I work a DevOps position currently, and I use it all day anyways 😄
nice
i'd definitely recommend following oop when you can, i feel like it's way more organized and it has a better logic flow
If you would have asked me that 4 years ago, I would have agreed.
How would you implement that for an express app?
app.cache = new MyCache()
app.get("/", (req,res) => { app.cache.get(req.data) })
I will say this cry, implementing OOP for the sake of OOP is counter intuitive. Abstraction for the sake of abstraction can be confusing to read and hard to manage. Sometimes, plain ole' imperative paradigm is good enough.
true
But, I'm not disagreeing.
i'm way more used to using oop since i always work with dotnet
yup
I mean my routes are i different files than my main app, to make it easier to understand
But I get what you mean Tim
you should be able to access app everywhere
if not, req and res should have a shortcut to it, no?
like djs has message.client shortcuts
lol
Oh that’s nice
Leave it to Tim to drop some knowledge
What's a doc?
😄
Oh! You're talking about StackExchange, right?
😄
Kidding, kidding.
lmao
im talking about doctors
:^)
circular dependencies are kinda one of the basic things about OOP, if your classes cant access their parent classes, you're doing it wrong
how would you implement caching? app.cache = { data: [], otherData: {} };? and I can just add and remove data from it
That's the naive implementation, yep
btw, never use this when using proxified objects or classes
You can also optimize it as well
And, MILLION, I say naive in a non-offensive manner here 😄
I'm not calling you naive, of course - haha
Wait, maybe not use a data: []
Instead, it really just acts as one large map.
I assumed you meant it as in not knowing anything about it
Check out keyv
could you send the link
thats my bot lul
Yeah, that works too lol
I don't use maps within maps though.
I'll prepend data:
Key = user.items
Val = (from database) user.items
ye thats another way of doing it
Yeah, there's really no right or wrong answer here ... as long as you're accomplishing the goal 😄
I'm just using the in-memory version of it. Once my bot scales, I'll plugin a redis cluster too it; however, I will know, in the back of my mind, that it can always integrate with it whenever I want.
So, essentially, it'll be plug-in-play when I scale.
All cache is ... is just one giant map. If you look at the src, it's basically what you showed above.
Of course, with a lot more to it 😄
// For caching
app.cache = require('./util/cache.json')```
```json
{ //cache.json
"files": [],
"urls": []
}``` so this is not a bad way of doing cache right
not a bad way no, but kinda useless doing it like that, when you can simply hard code it
true
Data in a string - yikes. I don't know about all of that lol
Keep in mind, @crimson vapor , you're storing information in an array with that Cache.
yes
one second lemme grab the data object
Obviously, I see files and urls

{
originalName: String,
name: String,
path: String,
views: Number,
uploader: String,
UploadedAt: String,
lock: {
active: Boolean,
password: String,
},
}```
file

@crimson vapor The password boi
If you place your files into a list, they won't be easy to retrieve unless you iterate through the list.
its not even implemented yet
what do you think would be a better way to do this? set cache.files to a map and cache.files.set(filename, fileObject)?
Ok back to suffering to find a way on how to get my captcha bot up-
I am adding caching to an express server that just returns images/files
@pseudo yew Aren't you hosting the bot?
for the purpose it was designed for, its actually good af
An alternative approach to your caching could be a map:
{ //cache.json
"files": {
"fileId": {
"attr": "val",
"attr2": "val2"
}
},
"urls": {}
}
okay so i use discordjs nodejs
my brain aint working anymore
k so. imagine if someone says *unscramble <text>
how to turn <text> into a var or a const or string
That way @crimson vapor , you could have an O(1) access (big o notation) ... just 1 json pull.
You just get the message that is sent and make it be a variable @earnest phoenix
versus iterating through an array would be O(n)? idk big o notation
i said how
How are you receiving the content @earnest phoenix
wdym with that
let content = message.content
^^
does it also ignore the *unscramble then?
that doesnt only get the text part guys, i think you're looking for .split()
Could you be more specific and make a more descriptive exmaple on how the content you reiecive looks like and how you get it.
@earnest phoenix
i see
alright
another question, what would be the difference from setting cache.files to a new Map() vs an object and doing it the way you said?
1 for loop = O(n)
nested for loop for: for = O(n^2)
need help with people who ask for help without explaining the problem

xD
convenience
would there be any cpu or memory usage difference
Honestly, I'm brand new to NodeJs. I couldn't tell you the difference between a map vs an object.
.toFixed(number of decimals) in js
alright this is a Tim question then
Prob
what do you normally use
Objects and Maps are generally the same thing, but Maps support all kinds of data types as keys, while Objects only support numbers and strings as keys
Objects are a bit more memory efficient as well
alright I will be using Objects
I use several different languages: bash, python, nodejs, typescript (well, really a superset ... not a language by itself), and occasionally Golang
ty Tim
say I have errors.json
in there it has a message.send embed function, would that work
and Thomas
@earnest phoenix Do this
${Math.floor(parseInt(si.currentLoad().currentload))}
NodeJS is so frivolous with its rules - I'm not confident about anything in it 😄
bash 👀, that's awesome though
node js doesn't respect basic math rules sadly though
Haha, bash is the worse. It's necessary for linux-based workflows at my job. I'm a developer by day
NodeJS doesn't respect anything.
I don’t think it would work in a json file tho
I don't mean the bugs with converting to binary
the bad thing about Objects is that there is no built in way to iterate over them, you need to use Object.keys and Object.values, while Maps have .keys() and .values() as dedicated iterators, which might make it a tiny bit faster to iterate over them if you ever need to
It doesn't even respect itself 😄
@long marsh Typescript is Typed Javascript
oh that makes sense
I know
TypeScript is more clear on its definitions / practices (imo) than JavaScript; however ES6 changes some of that.
errors.json:
message.channel.send // error embed here
// cmd file
const error5 = require(errors.json) // this is an example dw
if(!haspermission)
return error5
you know it's bad when someone who works with python says NodeJS is too flexible
wdym js doesnt respect math lmao
Is the type of "si.currentLoad().currentload"?
Python is flexible, but you can't just go:
a = 10;
a.pizza = 5;
in it 😄
you cant in js either xD
lol
[] == 0 // true
0 == "0" // true
"0" !== [] // false```
can some1 see my inquiry above
I thought you could, lol
you can with many things, but not with numbers
this 1
Ah, good call out.
@earnest phoenix https://gyazo.com/47b06b65139bb8e37cb69dbd282f72fa
But, the point still stands 😄
Interesting.
No errors though, how about dat
Python would raise a value error so quick 😄
yeah
objects are cool though
@earnest phoenix Can you console log si.currentLoad().currentload
And see what it returns
Yep that's why
Because that makes sense
is that because a is a Number instance and b is a property
the Number has a value of 5 but a property b of 10
Make sure you're getting the correct value @earnest phoenix
But, assigning a brand new property to an object outside of its original instantiation basically breaks the laws of physics coming from an OOP language 😄
Check on how you did it on the embed.
if I have fsreadDir on command folder, if I add sub folders in it will it still read those folders
Objects are just so closely related to maps in JavaScript (imo) ... in other languages .. that's not the case at all.
In fact, really, any other language 😄
You probably misspelt something or did not implement it correctly @earnest phoenix
js has classes for everything, but literal definitions such as numbers, strings, objects and arrays, have special rules in them that dont allow you to access their underlying instances, however you can still do new Number, new String, new Object or new Array, and it will work the same way, but this time give you full access
how do you delete the property of an object
delete obj.prop
oh
'literal definitions' -> primitive types 😄
ye
@earnest phoenix Can I see how you do it on the embed.
Sorry, I'm sure you knew that - just reiterating for anyone else that's curious.
#development message this is correct right
Send a snippet of the code or a screenshot
i said literal as in, you literally write them in your code instead of instantiating a class for it
Ahhhh
My fault
a = [];
b = new Array();
Yep yep
million-are-you-a-computer?
they are the exact same thing but follow slightly different rules
well I am supposed to be
@quartz kindle Lmfao
lol
Are they the exact same thing, Tim?
but app is not defined ig
I trust your judgement; however, they seem different 🤔
they are, or at least they are supposed to be
One seems like a primitive while the other is an Object representation of the primitive.
@crimson vapor Define app.
I typed app instead of req.app
Are we certain that's valid? Is there inheritance at play here?
what if a == b?
well, I guess not
They'd be two different memory addresses 🤔
Idk - Javascript comparisons confuse me
ye
@earnest phoenix Make a Variable named Auslastung and make it equal to the awaited currentload Then try to console log it
I think you just need to await it
"When in doubt, triple equals"
Hi guys I'm new to djs and I made my own starter code is it ok if you guys correct it? Or do I test it first?
ye
?
test it first, if it errors, read the errors, try to fix it, read docs, if you still cant manage on your own, ask here
realistically Object.values().length is the same as Object.keys().length correct?
yes
ok
Object.keys() would kinda be semantically more correct i think? who knows
Agreed.
i'd assume it would be faster
The moment when objects don't have a length property so you gotta cast them to an array, pepega
is an array not just a fancy object?
@earnest phoenix Lmfao
an object is a fancy array xD
o
and both are fancy hashmaps
Array is an object data type, not everything in JS has a unique type
js
types
proceed to laugh
[] == []
You know, more on that, is an array an object 🤔
false
Or is it a primitive?
an array is an object
I assumed an array was just an object where "0" was the first value and "1" was the next
there are a few diffences between arrays an objects in v8 tho
The moment when both arrays and object has the type of object but has different constructors

Constructor overloading, eh
under the hood, most objects are c++ hashmaps in v8
however arrays are not
It really depends on the language ,tbh
arrays have different c++ constructions depending on length and data size
I believe Java's primitive types are objects themselves.
At the base of all data structures are objects.
Java should have just been renamed to just object
jobject
Nah mate
woah woah woah
this is how arrays work in v8
We going back to binary
I'm not sure if there's a difference between them
xD
The elements of which are the holiest of holes.
when i see tim voltrex thomas or cry talking in here and im in here its the same thing has a kid sitting at the adult table
Holy double elements, quite interesting
a holey double element is used when you create an array with floating point numbers and empty holes, like this: [34.252,,,234.235235]
OH
That makes sense, though.
Would the empty 'holes' be filled?
Abstractly, I mean
pretty sure it stays the same
even if you eventually fill the holes, the underlying data structure will still be a sparse array
Ah, interesting.
Okay I have fixed the bug and now my caches are maps
Just get a shovel
Lol - we're all children
Well, I can't speak for voltrex or tim or cry .. I guess
and the stats json I made says there is 1 cached file https://million.is-a.computer/api/stats
im the kid thats always sitting in weird ways at the table
Bruv
i mean that in a way that i understand the gist of what yall are saying but i dont understand anything pass that
No?
I'm the kid that is trying their hardest to fit in with the others kids; however, due to my own paranoia, I end up not saying anything and inadvertently being marketed as a 'weird' kid.
facts
who needs to fit in, just be proud of your own uniqueness :3
Im the kid that is not on the list 
You right.
Imagine if tim was the kid that's sitting behind the class then when he gets angry and this shit appears in real life, you know shit is serious
who needs to fit in, just get more than 50 stars on a gh repo and you are now popular so people will start copying you to be normal
change the normal
@quartz kindle why eo you spend so muxh time helping ppl here?i rlly think they should make you like a helper role 🤣
lmao
Do*
Tim should get a Tim role
?
anyone that is very knowledgeable and respectful should get a Tim role
because it makes me feel better about myself :^)
Petition to give tim, Certified developer but tim role
lmao
can i trade the role for donators and patreons?
agreed
That's a 5head move
Yes
lol
i mean, at that point why not just join my server lmao
you have a server?
each question costs one patreon
Wait you got a server?
yes lol, the support server for my bot and my libs
Give link
can yall dm me please
by the way, if someone asks for a link to something, is it considered self promo if you send it?
First we decancer your username
BpeedKh
ty
Lol
can yall dm me please
Why
why do you want a dm?
i need a friend
Sure
this is not the place for that lol
Tim whats ur bots name
well it is if you contribute to the conversations in a helpful way
what are the chances that he is trying to grab the ip from the db?
-bots @tim
User not found
Hey guys, how would a economy bot work with mongo dB/quickmongo
any reference guides
What is quickmongo
Tf
Is there a way for a js library to tell if someone is using a user token?
a api wrapper for mongoose
Wrapper for a wrapper?
LOL
well a buy command would decrease a variable and a sell command would decrease a variable
Save money for a user then change it whenever u need to
It calls itself a MongoDB wrapper but one of its dependencies is mongoose LOL
so all you need to do is create schemas with the id as the user's id
and add a balance property
i have a profile schema
so add a balance property
and there should be a way to update it
im not quite sure since I only use basic features of mongoose
lol thats why im asking
Hi, i have my bot that can post to mongodb for prefixes and im not sure how to read from the database or to read it from just the API. Im not that great with mongo and to get it from the API i need to get the guild id from client.guild.id. Im using DJS commands too
I dont think thats a good idea
i have a way to update the balance $inc
<ClientUser>.bot
in djs
Check if anything is there first
if false djs should just destroy the client
Yea
If ur hosting ur bot locally u can just remove that part??
well why
yeah
Self bots
it should be obfuscated
unless u think ur funny making some shitty selfbot

Yea
obfuscating a oss lib thats on gh
so when a person buys it adds it to the user profile right?
thats some stupid shit
Doesn't matter
oh my
nullish coalescing
node not the right version?
isnt that node 14 syntax
Those are only available in Node.js v14+
Use n or nvm
what does ?? do?
i showed u
I mean
You shouldn't go for the latest
since its not wrong but its not right
Use LTS
yeah 15 has been annoying for me
yeah it was doing weird stuff in package-lock
and on other versions of node npm got confused
what is package-lock even?
yes i use npm i apologize in advance
so do I
well i use npm as well lol
Well it's because of the yarn stuff support or whatever
The package-lock formats were changed
so say u generate a premium code
db.set(premium, code)
but what if I run the generate again
package-lock is like, "this program has been tested and developed with these exact package versions"
it will replace the existing premium code
oh
oh my r u using quick.db
okay
npm i canvas
so you can use package-lock to make sure the exact same versions are installed elsewhere and ensure everything works, instead of installing the latest versions
iirc
npm rebuild
oh
npm rebuild
then why not db.set(premium_${code}, code) or something
why the fuck
if i create a structure file would that be better for a economy bot
Ah yes, we're iterating through many errors
uh u didnt install node properly
yeah you should use mongo or sql
node node index.js
lmfao
wat
nvmnvm
for(let error in errors) {
Tim.plsFix(error)
}
ignore that
node node node
if you have 32 bit windows, just install it twice so you get 64 bit
voltrex its not 2 times faster, its ^2 times faster
because its not 2 node its node * node
node index.js not node node index.js
I don't speak math
voltrex speaks javascript
I speak Node.js
doesnt know math

u must speak slowly
i only know math until 7th grade
oof
🗿 At least faster than others
does quick.db have a insertOne function
no
dont use quick.db
oof
thats my answer
Those are mongodb methods
use mongo
y it’s easy to use
so is mongo
its also slow
npm cannot install node lol
literally every database is easy to use depending on ur dedication to read documentation
quickdb is easy until you need some real features
npm is node's package manager lmao
So if I generated a code
It’s set to “premium_code, code”
But if I generated another code
forgot to filter dms
It overrides the existing code
it would be a different thing in database
it doesnt matter if you use 14 or 15, dont fret over it lol
json db is the best
yes
no it would be thing1_code1 thing2_code2
Imagine not using file database system
aight thanks
nah the best db is this.var
Sarcasm level here is off the charts
web system?
so you can view your DB on a website
oof rip
braincells are like below the charts here
wait brain cells exist here?
reload webstorm terminal
lol
🗿 There is no, "brain cells"
i need to wash my brain cells in the shower now
for (let brainCell of Tim.brainCells) {
await brainCell.wash(3); // Be sure to clean it 3 times
}```
this.544676649510371328_bal = 50```
to store stuff
i use scylla in prod and its pretty great
quick db doesnt use a website does it 🤔
no
that’s why I’m asking
if there’s anything similar to quick db but uses a website
cant you see your database with mongo?
but i dont think u have enuf braincells to comprehend cql or scylla as a whole
well, if you want it to use a website, like an api? i would build something myself 🤔
no database uses a website lol. there are programs out there that read the database and build a webserver where you can read and interact with it. the same can be done with any database whatsoever, just that some popular ones already a few written for them
if you just google "web dashboard for XYZ database" you will likely find many options
rethinkdb
kk
keep in mind that quick.db is not a database, its a database wrapper, so you wont find anything if you search for "dashboards for quick.db"
how does rethink db work
thumbnail?.source should work then
that url doesnt seem to exist lol
just tested and
its not parsing as json
so thats ur problem
const fs = require('fs');
const DB_PATH = 'data.json'
function readDB() {
try {
return JSON.parse(fs.readFileSync(DB_PATH));
} catch (err) {
throw "An error occured when reading from the DB.";
}
}
function writeDB(data) {
try {
data = JSON.stringify(data);
fs.writeFileSync(DB_PATH, data);
return true;
} catch (err) {
throw "An error occured when writing to the DB.";
}
}
function saveDataToDB(type, key, value) {
let data = readDB();
data[type][key] = value;
writeDB(data);
return true;
}```
rate my code
a solid 5/7
Because you don’t know which args he puts behind (args.join()...)
kinda shit bc functional code node oop
Hey, anyone provisioned Flannel, Calico, Canal or Weave networking plane before for a cluster?
unless thumbnail.source is a string "undefined"
A solid ineffienct/efficient
how would you improve my code?
google "5/7 meme"
yesyes
No tim, don't make me eval
need to see the pinnacle in speed
voltrex has entered the chat
how would I make it so the bot checks if a premium code is in the DB and not claimed
object with a boolean or something
hes using quick.db
you can still set objects
make premium codes an object and add code: boolean default to false
set to true when used
o
or just remove
isee
u can do db.set(code, false)
🗿
oh ik what to do
it does
ok good
atleast use this if ur gonna use quick.db https://github.com/plexidev/quick.db-rs
let premobj = {
code: "bleh",
claimed: false
}
db.set(`prem_${premobj.code}`, premobj)```
let pcode = db.fetch(code)
if(pcode === claimed) return msg.send(already claimed)
and need to stop your thought
that’s a horrible piece of code but just an example
yea
Well not a strict equally comparison, just access the property
hm so if someone entered the code as args 1, would I just do db.set args 1, claimed ?
example once again
if it’s a valid code ofc
if you use something like i sent you could do js if(db.fetch(`prem_${args[0]}`).claimed === true) return <message>.channel.send("no")
no u

yeah

especially if it was set to a string for some reason
Tim is writing the entire bible in 3 different ugandan languages
his code will fix every problem ever
const fs = require('fs');
class JSONDB {
constructor(file) {
this._file = file;
try {
this._data = JSON.parse(fs.readFileSync(file, "utf8"));
} catch(e) {
this._data = {}
fs.writeFileSync(file, "{}", "utf8");
}
}
get(key) {
return this._data[key];
}
set(key, value) {
this._data[key] = value;
try {
fs.writeFileSync(this._file + "-temp", JSON.stringify(this._data), "utf8");
fs.renameSync(this._file + "-temp", this._file);
} catch(e) {
throw "An error occured when writing to the DB: " + e;
}
}
}
lmao
what is oop?
object oriented programming
old outdated programming
out of poo
How do i get it to show nsfw servers?

what now?
the website
define it
oop based json db
wrong channel my friend
hmm
wrong website too probs
what website?
top gg
u cant show nsfw in top,.gg
sort by most users
My man really wrote a class
its against the rules iirc
Tim you should add different collections
this website
ask in #support
best json db gets a vote for their bot
Well tim never lost a competition so there's no point
JSONDB => JsonDB
actually i can top it up
import pg from 'pg';
cuz postgreSQL, if you using any other database, you doing it wrong

dont use pg use pg-native
pg > pg-native
which is basically what i did
yes
oh what basis lmfao
every
so anyway
the fact that pg-native is faster?
their libis better
how so?
i already killed my json db when i moved to sqlite, so not really lmao
ok
they actually have properly written types than the garbage attrocity they did in postgres
interface PromiseReturns {
[key:string]:any
}```
fucking lazy pricks
i remember they did this shit 3 or 4 times
ah well ur a genius whose using ts 🤯
its a hell to write interfaces when they do this garbage
btw how would you add jsdoc to a native library?
u dont lmao
it should be able to import jsdocs
What JSDoc does TypeScript-powered JavaScript support?
unless you can put the jsdoc in the typings?
u probs can just put it in the types yeah
it should import them just fine tim
lemme double check
it looks like the usual imports
either import at top of your code or simply
index.dt.ts
i'll look into it later then, i didnt even publish the lib yet
tim 100% making a nsfw bot
Wait, what lib
nothing much, just a remake of an existing native lib but using N-API instead of NAN
nhentie api, man of culture
lmao

🗿

i've been using the existing native lib for a few years now, and it works well, but it has some weird bugs
mine works perfectly
thats what i say about the main library for twitch
though i cant say mine works perfectly as its possibly a flag trigger for internal twitch spam

xD
i contributed a lot to the existing one, but icba anymore
i basically PRed all the latest major updates by myself
lmao
wait does data corrupt with writeFileSync?
reading? no
i'll make the js libs, you turn them into ts
Collaboration with tim, loggers moment
data corrupts when the writing operation is interrupted, for example by a program crash or forced exit
its not like to turn them into ts its as simple as changing the extension and adding types, cuz all the transpilation is done with ts

so realistically your way of making a tmp file prevents that right
yes
ok time to make a git repo
because a rename operation is Atomic
boom
its fully done by the operating system, and not by the node process
Tim's search history must be interesting
lmao
is that some skid complaining about my code while they dont even know async properly?
Changes extension
Woah wtf, magic

eh not much
oh
anyway how do you make npm modules?
rip lmao
Mods would get banned if they try to ban tim
That's how life works
irl too
use npm publish or a third party library like np
no I mean how do I make it so I can require my code in another place
sorry I didn't say what I meant
you module.exports it from your main file
o
then simply require()
or import and use es6 modules if you fancy and need an extra monocle
🧐
damn englishman
Life changes when you discover JS module exports

my life changed when i understood js prototypes
hello
aren't prototypes what every instance has access to
ye, and once you understand them, you can essentially hack anything in js
now not only tim's code is spaguetti, but all the other libs he hacks with protorypes too
oh
no
not THAT hack
its not as cool as you think
you just add methods and change functions
lol
Prototype pollution
and other extras bits, like hacking NASA and the FBI, but those are less important
^
i drank it
i dont like that comma in there nor that comment, .prototype. the fuck out of it
is there any way for me to set a constant in a package without using classes
wat
english hard when I just add words, you know
My life changed when I knew JS existed
Yup
saw that coming from a mile away lmao
so I have a constant DB_PATH how would I change that normally without using classes?
Ts is the promised land shiv, im telling you
I did want to finish that message with "for the worse" but couldn't be assed to
its py without the nuinsences
I need to learn TS
you do
your medicine is venom
tim
My medicine is Python and I'm high
Woah getting naughty there
strings are immutable tho xD
o




