June 16, 2025
Amazing to see as a neovim user myself :)
I learnt that I hate every moment of css. I couldnt get this goddamned portfolio box to work for like 40 minutes and then cursor just cooks this shit up in like 5 mins. Next up is actually putting stuff in this section
Welcome back! This is version idek of Yapper. At the time of sending this message I have spent 18 hours and 14 minutes on this project. Here is what I have to say. As you guys probably know, I wanted to switch the codebase to Javascript. Now, I've made some questionable choices with this bot. First, I started off with Python slack bolt, then I moved to using Javascript due to memroy issues that i had in the past (which actually was a very real issue I had), however I had realized that the Osu! wrapper for the API I was using at the time didnt have good alternatives for js so I just decided to have two different startup commands. Fast forward a bit, I got sick of that setup and moved back to my old python version and made some significant security and safety changes since then. And then, I wanted to have the bot work in javascript once again... because python was just not cutting it. I realized that ever since #rhythm-gamers existed, there was no point in me keeping the osu API. Blah Blah Blah. Here are some changes I made for the newest javascript version (i promise this will be the last time):
Added a leaderboard feature (with a somewhat better algorithm)
Added a score submission form for people to submit their rhythm game scores through #rhythm-gamers
Worked a bit more on #music-roast and made the last.fm API usage better
Added daily quotes as per @Aman Puttagunta’s request. Yapper will now send a quote from an API at 9am EDT everyday. You can also view one for yourself by running /yapperquote
Added a custom response for when a user's message has Java in it, Yapper will respond with the java boilerplate
This bot now runs on Nest! I'm planning on moving all the last fm stuff here such that it doesnt clog up my main channel!
Anyways have fun, enjoy things and dont forget to code!
(go star the repo, I would really appreciate it!)
Today I basically just implemented 2 features and wrote some docs. A bit more in detail I took inspo from a random message to make a custom slackbot response when someone says java it responds with public static void main string args. I implemented that and had it respond with the java emoji. Not only that, but I also made a quote scheduler. Everyday at 9 am it sends a quote from an api i found. You can also get a quote instantly but running /yapperquote
but this is only shown to you. I also wrote up some documentation but I need to update it a bit more tomorrow
Okay! So basically, I spent this whole day rewriting the codebase into javascript. I realized that python wasn't cutting it since some complex stuff like dynamic loading and reloading the whole codebase in python was not ideal and would have a very finnicky solution.
yay! I created the project!! The idea is pretty simple, I want to make a platformer game that has a really cool shotgun mechanic that pushes you in the opposite direction! Similar to Karlson (by Dani) that has a shotgun mechanic! Anyways, in this session I basically took a LOT of help from Fireentity (tysm fire!!) for stuff like proper project setup and the scene thing! I also added some animations for walking and idle
Alright so i basically commited my API Keys for Last.fm publicly so I could use lastfm without needing a framework or hosting it elsewhere and since its public it doesnt matter. Also uhh i added a place for star sites ie the most important link sites
Alright I wrote up some actually proper documentation and fixed the leaderboard issues, it doesnt even need a database anymore!
I honestly have no clue wtf ive been doing this. Welp first, I fixed the issue where the bot tweaks out and think every message in every channel it was in was a last fm username and started crashing out. I fixed that, pretty easy, also I wrote some documentation. The rest of the time was me just figuring out how to deal with this admin panel and mostly just fixing, i ended up dropping it (for now)
Alright so far there were a shit ton of unfortunate events. My bot got added to confessions and people were spamming the shit out of and made it into Grok 2.0. This taught me something very important, people are weird and they made yapper say weird shit. Also I needed to add a kill switch. thats exactly what i did. By running /yapperleave
it kicks the bot from the channel im gonna change this such that i can completely blacklist the bot from certain channels.
Alrighty so basically I added the basic site stuff such as stuff about me! I also added a rain effect that drops rain
I felt that my old site was really template like and looked kinda ass, so I decided to change it up! Inspired by Dimden.dev
So far, I added 7 commands using python rich and textual. The project is meant to be a nice overlay of the official codeforces api and it works really well so far! I added the help, user, problemset, ratings, log, streak, and contests commands so far. I even published the project through pip! I first tried pypi test but had to tweak the install command since it was using some packages that are only available on pypi. I took a really risky decision and decided to just push straight to pypi. Luckily, it works!! I'm writing some proper documentation for both pypi and the docs site so its gonna take a bit for that to be finished.
In this session, I literally rewrote THE ENTIRE CODEBASE from python into javascript. Now you see, I'm a dumbass. So I decided to torture myself just so I can get a tad bit more performance in my bot, especially when i host it to nest. So everything except for the osu api has been rewritten in javascript. The reason I left out the osu api, is because it relies on a third party wrapper for python, and so its specific to python. My next step is to either find a javascript wrapper, or use the normal shitty api!! Also go join #kashyap-does-coding-ig if you wanna see me build this sick bot
I made some more documentation and decided to test out the osu! API. For some reason, the actual osu! API is confusing and really weird to deal with. Like wdym I can't get global ranking through the API??? So I did some research and found two really good 3rd party osu api's that are actually good and surprisingly easy to setup and work with!!
Okey, in this session I started off with the bot. Firstly, I made a join message that gives a join message when someone joins the channel! (This went horribly wrong in summer of making). After that, I made a mention command. When someone pings the bot, it swears at you. But if you put text beside the ping, then it will use the hack club ai to give a reponse to the user. I also used last.fm api to grab my spotify listening and send a message based on that!
Yapper is a slackbot that I decided to make for my personal channel. Similar to Neon's Zeon bot. Hes a little aggressive but its okay!
Okay so in this whole project, I use react in order to make my static site for my ysws. I learnt how to make it actually look good while having a decent amount of information. I ran into a bit of an issue when I tried deploying on netlify due to it having a weird way to deal with react router so I had to search it up for that.
The website for my YSWS, neohack
In these past few days, I tried multiple times to get the binaries working by using pyinstaller. It finally works! With a few workarounds for mac and windows, you can now install the .exe and apple versions with a few extra commands to make it an executable and a global command! They are now available on github under the releases https://github.com/CompProgTools/CPCli/releases/tag/v1.0.0
In this MASSIVE session(s), I made the whole app as it is currently. I first had to research more about the nvim and vim api in order to understand how to do split tab functionality. Then I started on the plugin itself. I first tried to use JSON and other packages in Lua through luarocks but deemed it to be too complicated for the user, so I decided to make my own JSON parser. The reason I needed to use JSON in the first place was so that I can branch off easily from CPCli. Since most of my data and testing was already done in CPCli (my other project) I could just use the same files and same data from CPVim. I added a dashboard feature that takes info from the config and streak.json files. I also added a similar feature to the --use
flag in CPCli. This feature allows you to use a template in a certain file. If you use the command while not already in a file, it just takes the name of template, appends Main
to it and puts the according extension.
Okay in this session I added the stats system that allows you to get a general overview of your statistics. That includes, total problems solved, average rating, highest rating, most common tags, highest streak, etc. I've also made a graph subcommand that graphs the rating of all the problems you've solved over time. I also updated the documentation accordingly.
In this devlog, I worked on the streak system, added the cf log system that lets you log a day along with the problem you did. The streak system is pretty simple, you log a problem, and your streak is continued, it also shows what problem(s) you solved. I also added a code of conduct and contribute section to the documenation site!
In this kinda confusing yet fun session, I worked on the contribution section of my documentation. It really just let me flush out my ideas on what a CP-Cli contributor should be like, and what the main goal of this project is. What are we trying to do for competitive programmers, and why? That was the main question that I aimed to answer in this section. I also added a flag for the codeforces subcommand that allows you to set a problem as solved, this is so I can add streaks and graph/stats in the very near future in order for the programmer to better understand their consistency and where they focus their practice on. The attachment is what the --solved flag looks like and the usage. Really it was just a normal O(1) look up time on the dictionary since I have the required parameters!
WOW that was a long session. I spent good 90 minutes just writing documentation. I got the about me section as well as the installation, setup, and template section done. The docs are looking good all thanks to Mkdocs!! I also tested the sync command and it works!! The contest results from last week came out, and while I did lose 15 elo, the sync command tracks it!!!
This time, I wanted to add documentation and overall polishing the project as it is. I wanted to add a contribution, code of conduct, and documentation to the project so its more accessible for anyone new to contribute. I kinda just based the CONTRIBUTION.md
file based on what I think CP-Cli should look like in the future, being a fast and vast cli tool for all things competitive programming. I also based the code of conduct on the github guide and modified accordingly. For the documentation, I wanted a quick way to get started while not having to write the html, css, and js all the way from scratch. Thats when I remembered about jekyll through #tonic
, so I did a quick search for jekyll themes for documentation and came across Mkdocs
. It has a theme that is identical to that of read the docs, so I went with it. Tinkered around for a while a managed to get the docs and the rest of the project code onto one branch. You can access it at, docs
In this long ahh session I managed to get the template system working. Essentially, you can create templates for certain kinds of problems (ex: permutations, binary search, etc) using the command cp-cli template --make name.ext --alias alias
the template subcommand has other arguments for useful things such as the --make
command which allows you to make a template with the alias argument. So a binary search template command would look like:
cp-cli template --make binarySearch.cpp --alias binarySearch
and to use this template, simply use the command cp-cli template --use alias --filename name.ext
. The --use flag followed by alias
just refers to the alias created in the command before and the --filename
tag allows you to use that template in a predefine path in the config command
This was widely regarded as a great move by everyone.