<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Paul Comte</title>
    <subtitle>Paul Comte a backend software engineer, Rust, Java and C</subtitle>
    <link rel="self" type="application/atom+xml" href="https://paulcomte.cafe/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://paulcomte.cafe"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-01-25T00:00:00+00:00</updated>
    <id>https://paulcomte.cafe/atom.xml</id>
    <entry xml:lang="en">
        <title>🐌 My stance on IDEs</title>
        <published>2024-01-25T00:00:00+00:00</published>
        <updated>2024-01-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/blog/my-stance-on-ides/"/>
        <id>https://paulcomte.cafe/blog/my-stance-on-ides/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/blog/my-stance-on-ides/">&lt;blockquote&gt;
&lt;p&gt;IDE stands for &lt;code&gt;Integrated Development Evironment&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;the-discovery&quot;&gt;The discovery&lt;&#x2F;h2&gt;
&lt;p&gt;I started development around 2016, with the Java programming language, on a so-called “potato-pc”.&lt;&#x2F;p&gt;
&lt;p&gt;I began by coding minecraft plugins, but I was &lt;strong&gt;lost&lt;&#x2F;strong&gt;, I learnt by watching tutorials, and on these tutorials, the developers were all using the &lt;code&gt;Eclipse&lt;&#x2F;code&gt; IDE, so I decided to do like them, and I gave this IDE a try.&lt;&#x2F;p&gt;
&lt;p&gt;The experience, was… &lt;strong&gt;horrible&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;My computer, could barely handle the &lt;u&gt;&lt;em&gt;“heaviness”&lt;&#x2F;em&gt;&lt;&#x2F;u&gt; of the editor, and let’s not talk about the compilation that was taking ages where I could not use my laptop at all anymore.&lt;&#x2F;p&gt;
&lt;p&gt;Also the IDE had many bugs with plugin development, the developers in the tutorials were saying that it was “normal”, and that I’d get used to just ignoring the warnings and errors.&lt;&#x2F;p&gt;
&lt;p&gt;And so I did, for three months. I kept using &lt;code&gt;Eclipse&lt;&#x2F;code&gt;, I definetely lost hours through compilation, or by using the basic components of an IDE, such as going to the definition of a Java method, or implementing getters and setters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-way-out&quot;&gt;A way out?&lt;&#x2F;h2&gt;
&lt;p&gt;And then. In 2017, I started watching anoher Minecraft developer, he was typing fast, his IDE looked great, and it looked like it was performant.&lt;&#x2F;p&gt;
&lt;p&gt;I proceeded to download &lt;code&gt;IntelliJ&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And already, the bugs that &lt;code&gt;Eclipse&lt;&#x2F;code&gt; had, were no more. It was still slow on my computer, but it was a great progress, I could code faster.&lt;&#x2F;p&gt;
&lt;p&gt;But what made me fall in love with &lt;code&gt;IntelliJ&lt;&#x2F;code&gt; is the design, I never took the time to customize my &lt;code&gt;Eclipse&lt;&#x2F;code&gt; experience.&lt;&#x2F;p&gt;
&lt;p&gt;I had better performances, I had a nice background image on my code, the file icons looked great, thanks to the discovery of this new IDE, I definitely felt back in love with development, the spark rekindled.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;entering-university&quot;&gt;Entering University&lt;&#x2F;h2&gt;
&lt;p&gt;I entered &lt;code&gt;EPITECH&lt;&#x2F;code&gt; in 2020, and during a whole month I did not use &lt;code&gt;IntelliJ&lt;&#x2F;code&gt; or any other IDEs.&lt;&#x2F;p&gt;
&lt;p&gt;We were learning the &lt;code&gt;C&lt;&#x2F;code&gt; programming language by reading &lt;code&gt;man&lt;&#x2F;code&gt; pages, and using &lt;code&gt;emacs&lt;&#x2F;code&gt;, having no &lt;code&gt;language server&lt;&#x2F;code&gt; installed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;For those who don’t know what a &lt;code&gt;language server&lt;&#x2F;code&gt; is, it’s a tool bundled in IDEs that will act as a &lt;code&gt;middleware&lt;&#x2F;code&gt; between your code and the features of the language. Its simplest role can be of &lt;code&gt;syntax highlighting&lt;&#x2F;code&gt;, or also look for the use of variables, classes. etc&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Even though I had the features of a basic text editor, apart from &lt;code&gt;refactoring&lt;&#x2F;code&gt; my variables or structure names, I felt like I was coding faster than with an &lt;code&gt;IDE&lt;&#x2F;code&gt; running slowly on my computer.&lt;&#x2F;p&gt;
&lt;p&gt;I also didn’t feel the need for any &lt;code&gt;file tree&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-relapse&quot;&gt;The relapse&lt;&#x2F;h2&gt;
&lt;p&gt;Though, once I finished the month with the basic text editor, I installed &lt;code&gt;VSCode&lt;&#x2F;code&gt;, and felt a “relief”.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hope&quot;&gt;Hope?&lt;&#x2F;h2&gt;
&lt;p&gt;In 2021, I learnt about the &lt;code&gt;vim&lt;&#x2F;code&gt; editor, I heard that “every cool dev”, were using it.&lt;&#x2F;p&gt;
&lt;p&gt;So I decided to give it a try, but I felt like it was too hard, and not intuitive enough, so I gave up using it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;actual-hope&quot;&gt;Actual hope&lt;&#x2F;h2&gt;
&lt;p&gt;Around 2022, I was getting really “linux-nerdy”, I also wanted to use the lightest programs for everything, to save my laptop’s battery, so instead of having only 3-4 hours of battery, I’d increase it to 6-7 hours.&lt;&#x2F;p&gt;
&lt;p&gt;I also became a big fan of the &lt;code&gt;Rust&lt;&#x2F;code&gt; programming language, and by looking for programs made in &lt;code&gt;Rust&lt;&#x2F;code&gt; on GitHub, I stumbled across &lt;code&gt;helix-editor&lt;&#x2F;code&gt;, a &lt;code&gt;vim&lt;&#x2F;code&gt; like editor, purely made in Rust.&lt;&#x2F;p&gt;
&lt;p&gt;I decided to give &lt;code&gt;vim&lt;&#x2F;code&gt; programs another shot. And I’m grateful that I did!&lt;&#x2F;p&gt;
&lt;p&gt;It was actuall way more intuitive than &lt;code&gt;vim&lt;&#x2F;code&gt;, and the &lt;code&gt;language servers&lt;&#x2F;code&gt; were already pre-installed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;At the time of writing this post, &lt;code&gt;vim distros&lt;&#x2F;code&gt;, which install a version of &lt;code&gt;vim&lt;&#x2F;code&gt; with many bundled plugins, and language servers, are really famous, but I hadn’t heard of any of them in 2022.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So I stuck with it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;now&quot;&gt;Now?&lt;&#x2F;h2&gt;
&lt;p&gt;To this day, &lt;code&gt;IntelliJ&lt;&#x2F;code&gt;, remains my favorite IDE, and the one that I will use whenever I’d do Java programming.&lt;&#x2F;p&gt;
&lt;p&gt;But by using the &lt;code&gt;helix-editor&lt;&#x2F;code&gt; &lt;em&gt;(which I’m currently writing the blog with)&lt;&#x2F;em&gt;, I feel like my laptop is thanking me, and that my development workflow became better, and way faster.&lt;&#x2F;p&gt;
&lt;p&gt;Especially on laptops, I feel like using the touchpad is a big loss of time, mouses on computers are still fine, but not having to move your hands at all, and keep your hands on your keyboard is an amazing thing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;recommendations&quot;&gt;Recommendations&lt;&#x2F;h2&gt;
&lt;p&gt;I don’t recommend beginners in programming the use of editors like &lt;code&gt;vim&lt;&#x2F;code&gt;, they should learn the language itself first, and once they feel confident with it, they can use &lt;code&gt;helix-editor&lt;&#x2F;code&gt; or any &lt;code&gt;vim&lt;&#x2F;code&gt; distros.&lt;&#x2F;p&gt;
&lt;p&gt;And then, once they feel at ease with coding on &lt;code&gt;vim&lt;&#x2F;code&gt; they can fully customize it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rust-programming&quot;&gt;Rust programming&lt;&#x2F;h2&gt;
&lt;p&gt;Regarding the &lt;code&gt;Rust&lt;&#x2F;code&gt; programming language, there’s currently &lt;code&gt;RustRover&lt;&#x2F;code&gt; made by &lt;code&gt;Jetbrains&lt;&#x2F;code&gt;, the creators of &lt;code&gt;IntelliJ&lt;&#x2F;code&gt;, in &lt;code&gt;Preview&lt;&#x2F;code&gt;, I used it for three good months, but I had to stop.&lt;&#x2F;p&gt;
&lt;p&gt;Even though I have a really good laptop nowadays, when using &lt;code&gt;RustRover&lt;&#x2F;code&gt; my computer lasts at most 2 hours, and is using 4-6GB of RAM just for the &lt;code&gt;IDE&lt;&#x2F;code&gt;, that’s crazy.&lt;&#x2F;p&gt;
&lt;p&gt;I also tried out &lt;code&gt;lapce&lt;&#x2F;code&gt;, an editor made in &lt;code&gt;Rust&lt;&#x2F;code&gt;, and it’s actually great! But it lacks stability, if you want to use it, please wait at least some months, maybe a year, until it becomes more stable.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>📝 Creating a blog</title>
        <published>2024-01-24T00:00:00+00:00</published>
        <updated>2024-01-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/blog/creating-a-blog/"/>
        <id>https://paulcomte.cafe/blog/creating-a-blog/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/blog/creating-a-blog/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;website&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It’s been a long time since I’ve wanted a blog.&lt;&#x2F;p&gt;
&lt;p&gt;Having a blog has so many advantages, such as being able to store your researches somewhere, and it might help others working on the same subject&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>📡 A protocol system in C++</title>
        <published>2023-03-24T00:00:00+00:00</published>
        <updated>2023-03-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/blog/a-protocol-system/"/>
        <id>https://paulcomte.cafe/blog/a-protocol-system/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/blog/a-protocol-system/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&#x2F;tree&#x2F;main&#x2F;protocol&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;During the realization of the &lt;code&gt;Babel&lt;&#x2F;code&gt; project, I had to work on a protocol system, to enable interactions between the client and the server.&lt;&#x2F;p&gt;
&lt;p&gt;If you want more details about the base project, feel free to click &lt;a href=&quot;&#x2F;projects&#x2F;babel&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Programming language: C++&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The protocol system does not depend on anything else.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;packetmanager&quot;&gt;PacketManager&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;global-functions&quot;&gt;Global functions&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h5 id=&quot;deserialize-std-string-packet&quot;&gt;deserialize(std::string &amp;amp;packet)&lt;&#x2F;h5&gt;
&lt;pre&gt;&lt;code&gt;1. message[0] == &amp;#x27;0x32&amp;#x27;?
   We check if the first byte is our magic value.

2. PacketType = message[1]
   We retrieve the packet type from the next byte.

3. PacketField[] = message[2..]
   We convert the rest of the content into a list of packet field.

4. Packet = Deserialize(PacketType, PacketField[])
   We call the deserialize function for the specific packet type, with the list of packet fields.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h5 id=&quot;serialize-packet&quot;&gt;serialize(Packet&amp;amp;)&lt;&#x2F;h5&gt;
&lt;blockquote&gt;
&lt;p&gt;It will simply call the &lt;code&gt;serialize&lt;&#x2F;code&gt; inherited function from the Packet class.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h4 id=&quot;handlepacket-packet-packet&quot;&gt;handlePacket(Packet &amp;amp;packet)&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h5 id=&quot;server-side-implementation&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&#x2F;blob&#x2F;main&#x2F;protocol&#x2F;server&#x2F;ServerPacketManager.cpp&quot;&gt;Server-side implementation&lt;&#x2F;a&gt;&lt;&#x2F;h5&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h5 id=&quot;client-side-implementation&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&#x2F;blob&#x2F;main&#x2F;protocol&#x2F;client&#x2F;ClientPacketManager.cpp&quot;&gt;Client-side implementation&lt;&#x2F;a&gt;&lt;&#x2F;h5&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A trivial implementation of the &lt;code&gt;handlePacket&lt;&#x2F;code&gt; function is to simply loop through all &lt;code&gt;PacketHandler&lt;&#x2F;code&gt;s, to target the one registered for the received packet.&lt;&#x2F;p&gt;
&lt;p&gt;You can also use a &lt;code&gt;HashMap&amp;lt;PacketType, PacketHandler&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;packethandler&quot;&gt;PacketHandler&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;serverpackethandler&quot;&gt;ServerPacketHandler&lt;&#x2F;h4&gt;
&lt;pre&gt;&lt;code&gt;handle(Packet&amp;amp;, std::shared_ptr&amp;lt;ServerManager&amp;gt;, IoClient*)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h4 id=&quot;clientpackethandler&quot;&gt;ClientPacketHandler&lt;&#x2F;h4&gt;
&lt;pre&gt;&lt;code&gt;handle(Packet&amp;amp;, std::shared_ptr&amp;lt;ClientManager&amp;gt;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;fields&quot;&gt;Fields&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;Here’s the base structure of a field&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;remaining bytes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;character-field&quot;&gt;Character field&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;integer-field-4-bytes&quot;&gt;Integer field (4 bytes)&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[0]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[1]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[2]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[3]&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x01&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;unsigned-integer-field-4-bytes&quot;&gt;Unsigned Integer field (4 bytes)&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[0]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[1]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[2]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[3]&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x02&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;unsigned-integer-64-field-8-bytes&quot;&gt;Unsigned Integer 64 field (8 bytes)&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[0]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[1]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[2]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[3]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[4]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[5]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[6]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[7]&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x03&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; OxFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;string-field&quot;&gt;String field&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;field_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;size[0]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;size[1]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;size[2]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;size[3]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[0]&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;[n]&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;n-1 bytes&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x04&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;packets&quot;&gt;Packets&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;Here’s the base structure of a packet:&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;magic&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;packet_type&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;fields[]&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;size&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;1 byte&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;remaining bytes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;value&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x32&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;0x00 =&amp;gt; 0xFF&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;calluppacket&quot;&gt;CallUpPacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;username&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;hostname&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;port&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;uint&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;hanguppacket&quot;&gt;HangUpPacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;username&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;contactpacket&quot;&gt;ContactPacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;username&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;loginerrorpacket&quot;&gt;LoginErrorPacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;error&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;loginpacket&quot;&gt;LoginPacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;username&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;logoutpacket&quot;&gt;LogoutPacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;empty&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;empty&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;messagepacket&quot;&gt;MessagePacket&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;sender&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;recipient&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;content&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;timestamp&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;uint64&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;sample-implementation&quot;&gt;Sample implementation&lt;&#x2F;h2&gt;
&lt;p&gt;You can check out the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&#x2F;wiki&quot;&gt;GitHub wiki&lt;&#x2F;a&gt; to have more details on an example implementation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future&quot;&gt;Future ?&lt;&#x2F;h2&gt;
&lt;p&gt;If I ever get the time to work on my protocol system, I would definitely write a file parser to create packets from simple json files.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>📱 Babel</title>
        <published>2023-03-09T00:00:00+00:00</published>
        <updated>2023-03-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/babel/"/>
        <id>https://paulcomte.cafe/projects/babel/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/babel/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;result&quot;&gt;Result&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&#x2F;raw&#x2F;main&#x2F;assets&#x2F;preview.png&quot; alt=&quot;Result&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;project-definition&quot;&gt;Project definition&lt;&#x2F;h3&gt;
&lt;p&gt;This project was an &lt;code&gt;EPITECH&lt;&#x2F;code&gt; project, the project was defined as followed:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A client interface&lt;&#x2F;li&gt;
&lt;li&gt;TCP communication between the client and the server&lt;&#x2F;li&gt;
&lt;li&gt;UDP communication between two clients&lt;&#x2F;li&gt;
&lt;li&gt;Send messages to another client&lt;&#x2F;li&gt;
&lt;li&gt;Retrieve client conversation (messages sent and received)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Programming language: C++&lt;&#x2F;li&gt;
&lt;li&gt;Window library: Qt&lt;&#x2F;li&gt;
&lt;li&gt;Server library: asio&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;the-journey&quot;&gt;The journey&lt;&#x2F;h3&gt;
&lt;p&gt;During this project I wanted to have lots of fun, and on top of the mandatory features, implement other features that to me, should be available on every real-time messaging and voice app.&lt;&#x2F;p&gt;
&lt;p&gt;Regarding the interface I decided to take the Discord interface for idea.&lt;&#x2F;p&gt;
&lt;p&gt;This was the first ever project where I started by working on the frontend, whereas my usual habit would be to work on the backend.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to have a clearer view of the result I wanted to provide, and also improve my frontend skills.&lt;&#x2F;p&gt;
&lt;p&gt;And actually, starting by working on the frontend was a good choice for two main reasons:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I did know in advance what features I would have on the client, so no time lost on the backend with unimplemented features on the client-side.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I lost a precious time trying to compile the frontend, so if I had to work on the frontend after the backend I might had not forseen this and I’d be unable to implement all features in time.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h2 id=&quot;frontend-architecture&quot;&gt;Frontend architecture&lt;&#x2F;h2&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;scenes&quot;&gt;Scenes&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;left-layout&quot;&gt;Left layout&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;User: &lt;code&gt;Icon | Username | Logout&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Contact: &lt;code&gt;for contact in contacts =&amp;gt; contactBox(contact)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Search: &lt;code&gt;Text input&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h4 id=&quot;right-layout&quot;&gt;Right layout&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Chat info scene: &lt;code&gt;CallUp&#x2F;HangUp Buttons&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Chat scene: &lt;code&gt;for message in messages =&amp;gt; messageBox(message)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Chat box scene: &lt;code&gt;Text input&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;event-system&quot;&gt;Event system&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;The need for an event system was necessary the following interactions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;When the user would interact on the client, such as changing the selected contact, or looking for a contact by its name&lt;&#x2F;li&gt;
&lt;li&gt;When the server would send a packet to the client.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;login-failed&quot;&gt;LOGIN_FAILED&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;errorMessage&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;logout&quot;&gt;LOGOUT&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;empty&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;empty&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;contact-filter-update&quot;&gt;CONTACT_FILTER_UPDATE&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;newFilter&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;string&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;new-contact&quot;&gt;NEW_CONTACT&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;contact&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;shared_ptr&amp;lt;Client&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;new-bulk-contact&quot;&gt;NEW_BULK_CONTACT&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;contacts&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;vector&amp;lt;shared_ptr&amp;lt;Client&amp;gt;&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;new-message&quot;&gt;NEW_MESSAGE&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;message&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;shared_ptr&amp;lt;Message&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;new-bulk-message&quot;&gt;NEW_BULK_MESSAGE&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;messages&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;vector&amp;lt;shared_ptr&amp;lt;Message&amp;gt;&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;new-client&quot;&gt;NEW_CLIENT&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;client&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;shared_ptr&amp;lt;Client&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;new-chatting&quot;&gt;NEW_CHATTING&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;previousClient&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;newClient&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;shared_ptr&amp;lt;Client&amp;gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;shared_ptr&amp;lt;Client&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;call-state-update&quot;&gt;CALL_STATE_UPDATE&lt;&#x2F;h4&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;description&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;update&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;u&gt;&lt;strong&gt;field_type&lt;&#x2F;strong&gt;&lt;&#x2F;u&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;shared_ptr&amp;lt;Client&amp;gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;backend-architecture&quot;&gt;Backend architecture&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;database-system&quot;&gt;Database system&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;getMessages(string username) -&amp;gt; vector&amp;lt;Message&amp;gt;&lt;&#x2F;li&gt;
&lt;li&gt;getContacts(string username) -&amp;gt; vector&amp;lt;string&amp;gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;h3 id=&quot;transporter&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;babel&#x2F;blob&#x2F;main&#x2F;server&#x2F;Transporter.hpp&quot;&gt;Transporter&lt;&#x2F;a&gt;:&lt;&#x2F;h3&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Every conneted clients on the server has a &lt;code&gt;Transporter&lt;&#x2F;code&gt;, it implements the following functions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;sendMessage(string)&lt;&#x2F;li&gt;
&lt;li&gt;readMessage(function&amp;lt;void(string) receivedMessage&amp;gt; callback)&lt;&#x2F;li&gt;
&lt;li&gt;getHostname() -&amp;gt; string&lt;&#x2F;li&gt;
&lt;li&gt;close()&lt;&#x2F;li&gt;
&lt;li&gt;isClosed() -&amp;gt; bool&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;difficulties&quot;&gt;Difficulties&lt;&#x2F;h2&gt;
&lt;p&gt;In this project I encountered a major difficulty, which was with the compilation of the project on the linux distribution &lt;code&gt;NixOS&lt;&#x2F;code&gt;, I lost a lot of time.&lt;&#x2F;p&gt;
&lt;p&gt;I also faced another difficulty, that I sadly could not resolve, the audio library in C++ seems like to not work on Linux, therefore I can only compile the client on Windows if I enable the voice call feature…&lt;&#x2F;p&gt;
&lt;h2 id=&quot;protocol-system&quot;&gt;&lt;a href=&quot;&#x2F;blog&#x2F;a-protocol-system&quot;&gt;Protocol system&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;One of the fundamental point in this project was the protocol system.&lt;&#x2F;p&gt;
&lt;p&gt;It needed to be as flexible and ergonomic as possible.&lt;&#x2F;p&gt;
&lt;p&gt;I implemented a protocol system which I got so proud of that &lt;a href=&quot;&#x2F;blog&#x2F;a-protocol-system&quot;&gt;I wrote an article&lt;&#x2F;a&gt; to explain how I proceedeed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;features&quot;&gt;Features&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;The icon of an user is automatically generated from his username.&lt;&#x2F;li&gt;
&lt;li&gt;Messages are stacked until &lt;code&gt;x&lt;&#x2F;code&gt; amount of time has passed, or &lt;code&gt;x&lt;&#x2F;code&gt; amount of messages has been sent.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;limitations&quot;&gt;Limitations&lt;&#x2F;h2&gt;
&lt;p&gt;Due to the limitations of my architecture, as it wasn’t thought in time, and I didn’t have time to refactor, the history of messages will only stack if the user switches to another conversation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future&quot;&gt;Future?&lt;&#x2F;h2&gt;
&lt;p&gt;If I ever get the chance to work on the project again, I would fix the previously cited limitation, and improve the abstraction, such as:&lt;&#x2F;p&gt;
&lt;p&gt;Instead of the following function: &lt;code&gt;getContacts(string username)&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would instead replace the &lt;code&gt;string&lt;&#x2F;code&gt; to an &lt;code&gt;Username&lt;&#x2F;code&gt; struct&#x2F;class&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>💸 Grisked</title>
        <published>2022-09-15T00:00:00+00:00</published>
        <updated>2022-09-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/grisked/"/>
        <id>https://paulcomte.cafe/projects/grisked/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/grisked/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Grisked&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;result&quot;&gt;Result&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;grisked.png&quot; alt=&quot;Grisked preview&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;Managing money is important, especially as a student where you have limited resources.&lt;&#x2F;p&gt;
&lt;p&gt;Using google sheets, or excel documents is not trivial, and might be tedious for beginners.&lt;&#x2F;p&gt;
&lt;p&gt;I heard about the app &lt;code&gt;Microsoft money&lt;&#x2F;code&gt;, but it was old, no longer supported on newer versions of Windows, so there came the idea to create a similar app by myself.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Programming language: Rust&lt;&#x2F;li&gt;
&lt;li&gt;Window framework: iced.rs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;grisked-profile&quot;&gt;grisked_profile&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;structures-and-enums&quot;&gt;Structures and Enums&lt;&#x2F;h4&gt;
&lt;p&gt;&lt;em&gt;Note: For fields with &lt;code&gt;#[serde(skip_serializing)]&lt;&#x2F;code&gt; above their declaration, they’re not being serialized, therefore, not saved, as they’re only fields for the &lt;code&gt;grisked_ui&lt;&#x2F;code&gt; runtime.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;details&gt;
  &lt;summary&gt;enum BillType&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;Income,
Invoice,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;struct Bill&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;bill_type: BillType,
name: String,
price: f64,
due_date: u16,
label_id: Option&amp;lt;usize&amp;gt;,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;struct Account&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;name: String,
#[serde(skip_serializing)]
id: Option&amp;lt;usize&amp;gt;,
default_balance: f64,
bills: Vec&amp;lt;Bill&amp;gt;,
color: [f32; 3],
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;struct Currency&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;symbol: char,
name: String,
alias: String,
convert_rate: f32,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;struct Data&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;#[serde(skip_serializing)]
path: Option&amp;lt;String&amp;gt;,
accounts: Vec&amp;lt;Acccount&amp;gt;,
labels: Vec&amp;lt;Label&amp;gt;,
#[serde(skip_serializing)]
account_id: Option&amp;lt;usize&amp;gt;,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;struct Label&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;id: usize,
name: String,
color: [f32; 3],
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;struct Settings&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;#[serde(skip_serializing)]
path: Option&amp;lt;String&amp;gt;,
currencies: Vec&amp;lt;Currency&amp;gt;,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h4 id=&quot;serialization&quot;&gt;Serialization&lt;&#x2F;h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Everything is serialized using the &lt;code&gt;json&lt;&#x2F;code&gt; format&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h5 id=&quot;settings-json&quot;&gt;&lt;code&gt;settings.json&lt;&#x2F;code&gt;&lt;&#x2F;h5&gt;
&lt;p&gt;&lt;em&gt;This file stores global settings, not related to any account, you can view them as app settings&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h5 id=&quot;data-json&quot;&gt;&lt;code&gt;data.json&lt;&#x2F;code&gt;&lt;&#x2F;h5&gt;
&lt;p&gt;&lt;em&gt;This file stores data related to the user, a list of accounts (themselves storing bills), and user-defined labels&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;grisked-ui&quot;&gt;grisked_ui&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h4 id=&quot;event-system-definitions&quot;&gt;Event system definitions&lt;&#x2F;h4&gt;
&lt;details&gt;
  &lt;summary&gt;enum UpdateBox&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;LabelName(String),
AccountName(String),
InvoiceName(String),
IncomeName(String),
InvoiceAmount(String),
IncomeAmount(String),
AccountDefaultBalance(String),
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;details&gt;
  &lt;summary&gt;enum Message&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;MenuChanged(MenuType),
KeyPressed(KeyCode, Modifiers),
PreviousAccount,
NextAccount,
SaveRequested,
AddAccount,
AddLabel,
AddInvoice,
AddIncome,
UpdateBox(UpdateBox),
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h4 id=&quot;event-system-usage&quot;&gt;Event system usage&lt;&#x2F;h4&gt;
&lt;p&gt;This event system was made for the user performing interactions on the app.
The enum &lt;code&gt;Message&lt;&#x2F;code&gt; has self-explanatory members, such as when a user tries to click on the &lt;code&gt;NextAccount&lt;&#x2F;code&gt; arrow, or when he creates a new invoice, etc*&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h4 id=&quot;menus&quot;&gt;Menus&lt;&#x2F;h4&gt;
&lt;details&gt;
  &lt;summary&gt;enum MenuType&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;#[default]
Dashboard,
Accounts,
AccountData(Account),
Deadlines,
Charts,
Backup,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;details&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;difficulties&quot;&gt;Difficulties&lt;&#x2F;h2&gt;
&lt;p&gt;This project wasn’t particulary difficult, or didn’t have any complex issues, though implementing the UI style was really time-consuming.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>▶️ UverWorld</title>
        <published>2022-09-10T00:00:00+00:00</published>
        <updated>2022-09-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/uverworld/"/>
        <id>https://paulcomte.cafe/projects/uverworld/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/uverworld/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Uver-World&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Engine framework: bevy.rs&lt;&#x2F;li&gt;
&lt;li&gt;API framewor: rocket.rs&lt;&#x2F;li&gt;
&lt;li&gt;Database: MongoDB&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>📜 samira</title>
        <published>2022-07-05T00:00:00+00:00</published>
        <updated>2022-07-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/samira/"/>
        <id>https://paulcomte.cafe/projects/samira/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/samira/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;samira&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Programming language: Rust&lt;&#x2F;li&gt;
&lt;li&gt;Requests library: reqwest&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>🔎 ExoBuilds</title>
        <published>2022-03-29T00:00:00+00:00</published>
        <updated>2022-03-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/exobuilds/"/>
        <id>https://paulcomte.cafe/projects/exobuilds/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/exobuilds/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ExoBuilds&#x2F;&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;result&quot;&gt;Result&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;exobuilds.png&quot; alt=&quot;ExoBuilds preview&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;During 2022, I used to play &lt;code&gt;League of Legends&lt;&#x2F;code&gt; with my friends, and they recommended me to use a website to get the best champion builds.&lt;&#x2F;p&gt;
&lt;p&gt;A really famous one is &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;U.GG&quot;&gt;U.GG&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;For those who are not yet introduced to this game, you can get more informations &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;League_of_Legends&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I was looking for project ideas to code on my spare time, and the idea of working on such website really enjoyed me.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Programming language: Rust&lt;&#x2F;li&gt;
&lt;li&gt;Web-server framework: rocket.rs&lt;&#x2F;li&gt;
&lt;li&gt;Database: MongoDB&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-journey&quot;&gt;The journey&lt;&#x2F;h2&gt;
&lt;p&gt;First thing first was to set up a default web server, I therefore followed the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rocket.rs&#x2F;v0.5&#x2F;guide&#x2F;getting-started&#x2F;&quot;&gt;rocket.rs getting started guide&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then I looked for available Riot Games API wrappers in Rust, but I could not find any.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>🖥️ Implementing a screensaver in C</title>
        <published>2021-12-11T00:00:00+00:00</published>
        <updated>2021-12-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/blog/c-screensaver/"/>
        <id>https://paulcomte.cafe/blog/c-screensaver/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/blog/c-screensaver/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;C-ScreenSaver&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;While I was going back to my parents’ home, I had 6 hours to kill in the train.&lt;&#x2F;p&gt;
&lt;p&gt;I had no internet nor any way to charge my laptop so I decided to work on something simple with libraries that my pc already had downloaded.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;items&quot;&gt;Items&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;A laptop with a linux environment installed (NixOS)&lt;&#x2F;li&gt;
&lt;li&gt;A charger with no power socket nearby&lt;&#x2F;li&gt;
&lt;li&gt;A C compiler (gcc)&lt;&#x2F;li&gt;
&lt;li&gt;A graphical library (SFML)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With that in mind I had an idea that seemed trivial and not too long to implement.&lt;&#x2F;p&gt;
&lt;p&gt;A &lt;code&gt;Screen saver&lt;&#x2F;code&gt; made in C&lt;&#x2F;p&gt;
&lt;h2 id=&quot;steps&quot;&gt;Steps&lt;&#x2F;h2&gt;
&lt;p&gt;I organized the project in the following small steps:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Initialize a simple window&lt;&#x2F;li&gt;
&lt;li&gt;Create an argument parser&lt;&#x2F;li&gt;
&lt;li&gt;Create a tick rate system&lt;&#x2F;li&gt;
&lt;li&gt;Implement a simple screen saver algorithm&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>🕹️ RqndomUHC</title>
        <published>2021-09-03T00:00:00+00:00</published>
        <updated>2021-09-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/rqndomuhc/"/>
        <id>https://paulcomte.cafe/projects/rqndomuhc/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/rqndomuhc/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;RqndomUHC-API&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;The idea of creating such Minecraft plugin’s library, originated from the development of the &lt;a href=&quot;&#x2F;blog&#x2F;r-value&quot;&gt;&lt;code&gt;RValue&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; class in Java.&lt;&#x2F;p&gt;
&lt;p&gt;I had just finished working on my &lt;a href=&quot;&#x2F;projects&#x2F;naruto-uhc&quot;&gt;&lt;code&gt;NarutoUHC&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; Minecraft plugin, that I realized if I wanted to create more UHC plugins, I had to abstract the process as much as possible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Programming language: Java&lt;&#x2F;li&gt;
&lt;li&gt;Library: Spigot 1.16.5&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;developer-s-documentation&quot;&gt;Developer’s Documentation&lt;&#x2F;h2&gt;
&lt;p&gt;I worked on a documentation made for developers who wanted to use this project to create their own UHC game modes.&lt;&#x2F;p&gt;
&lt;p&gt;You can find it &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rqndomuhc.rqndomhax.io&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: the documentation is still [&lt;code&gt;Work In Progress]&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;project-definition&quot;&gt;Project definition&lt;&#x2F;h2&gt;
&lt;p&gt;The project is divided in two parts.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Library: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;RqndomUHC-API&quot;&gt;&lt;strong&gt;RqndomUHC-API&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Library implementation &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;RqndomUHC&quot;&gt;&lt;strong&gt;RqndomUHC&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: When I first started working on the project I had the idea of selling the &lt;code&gt;Library implementation&lt;&#x2F;code&gt;, and keeping the project closed-source&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;dependency-injection&quot;&gt;Dependency injection&lt;&#x2F;h2&gt;
&lt;p&gt;This is the &lt;strong&gt;core-feature&lt;&#x2F;strong&gt; of the library, allow dependency injection as much as possible, to push the Java’s objet oriented programming to its limits.&lt;&#x2F;p&gt;
&lt;p&gt;Therefore, everything implemented, can be changed by other plugins implementing the library.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;features&quot;&gt;Features&lt;&#x2F;h2&gt;
&lt;p&gt;Here’s a list of features available in the &lt;code&gt;RqndomUHC&lt;&#x2F;code&gt; plugin’s library:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;worlds-manager&quot;&gt;Worlds manager&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;host-config&quot;&gt;Host config&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;scoreboard&quot;&gt;Scoreboard&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;dynamic-inventories&quot;&gt;Dynamic inventories&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;scoreboard-1&quot;&gt;Scoreboard&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;player-system&quot;&gt;Player system&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;task-system&quot;&gt;Task system&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;message-system&quot;&gt;Message system&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;role-system&quot;&gt;Role system&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;events-system&quot;&gt;Events system&lt;&#x2F;h3&gt;
&lt;p&gt;There exists an event system, so other plugins could re-implement the events on the go.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;utils&quot;&gt;Utils&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Banners
This utility help you create banners.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;BukkitSerializer
This serializer class can convert a List of &lt;code&gt;ItemStack&lt;&#x2F;code&gt; to a Base64 String, it’s used in the plugin to store Inventories in a configuration file.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Chrono
This static class converts a duration into a formatted value&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;FileManager
This class lets you manage file configurations in &lt;code&gt;YAML&lt;&#x2F;code&gt; format.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;HostConfig
Configuration helper, that stores &lt;code&gt;RValue&lt;&#x2F;code&gt; data, and saves it into a configuration file.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;HostItemStack
An &lt;code&gt;ItemStack&lt;&#x2F;code&gt; (Minecraft items) that stores a &lt;code&gt;Consumer&amp;lt;PlayerInteractEvent&lt;&#x2F;code&gt;, to add event handlers to items on the go.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ItemBuilder
Builder class to create a custom &lt;code&gt;ItemStack&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;PlayerUtils
Utility class relative to the players:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java &quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;double getRadius(Location, Location); &amp;#x2F;&amp;#x2F; Returns a radius between two locations
void clearInventory(Player); &amp;#x2F;&amp;#x2F; Clears the Player&amp;#x27;s inventory
void saveInventory(ItemStack[], Player, boolean clear); &amp;#x2F;&amp;#x2F; Saves the player&amp;#x27;s inventory into the ItemStack, if clear is set to true, also clears the Player&amp;#x27;s inventory
void giveInventory(ItemStack[], Player); &amp;#x2F;&amp;#x2F; Sets the Player&amp;#x27;s inventory from the given ItemStack
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;rvalue&quot;&gt;RValue&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-to-create-a-team-system&quot;&gt;How to create a team system?&lt;&#x2F;h2&gt;
&lt;p&gt;Your UHC plugins needs a team system? No problem, just follow me:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a new team:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;class MonsterTeam implements Team {}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;h3 id=&quot;a-team-system-on-a-player-s-role&quot;&gt;A team system on a player’s role:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Create a new role&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code&gt;class Monster implements IRole {
    public Monster() {
      this.getValues().add(&amp;quot;plugin_name.role.team&amp;quot;, MonsterTeam.class);
    }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that’s it, now if you create a role that extends from &lt;code&gt;Monster&lt;&#x2F;code&gt;, it will automatically have the team &lt;code&gt;MonsterClass&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;a-team-system-on-a-player&quot;&gt;A team system on a player:&lt;&#x2F;h3&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code&gt;  GamePlayer gamePlayer; &amp;#x2F;&amp;#x2F; This needs to be a valid GamePlayer
  gamePlayer.getValues().add(&amp;quot;plugin_name.team&amp;quot;, MonsterTeam.class)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>🍏 Naruto UHC</title>
        <published>2021-01-08T00:00:00+00:00</published>
        <updated>2021-01-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://paulcomte.cafe/projects/naruto-uhc/"/>
        <id>https://paulcomte.cafe/projects/naruto-uhc/</id>
        
        <content type="html" xml:base="https://paulcomte.cafe/projects/naruto-uhc/">&lt;h2 id=&quot;repository&quot;&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;NarutoUHC&quot;&gt;Repository&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;I was contacted by a friend around August 2020, to work on a Minecraft project, a custom UHC game mode.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;NarutoUHC&lt;&#x2F;code&gt; game mode.&lt;&#x2F;p&gt;
&lt;p&gt;I was getting kind of busy as it was soon the beginning of my first year of studies at &lt;code&gt;EPITECH&lt;&#x2F;code&gt;, therefore, I declined my friends’ offer, and recommended him another developer.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately, my friend paid that developer, and during three months we didn’t get any news from him, therefore, I refunded my friend, and kept pressuring the developer he contacted into refunding the money, otherwise I would go and take legal actions.&lt;&#x2F;p&gt;
&lt;p&gt;Fortunately, during mid-December, the developer refunded my friend, and as it was getting towards the end of my first semester, I decided to work on the project instead.&lt;&#x2F;p&gt;
&lt;p&gt;I began working on it on the 8th of January 2021.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-details&quot;&gt;Project details&lt;&#x2F;h2&gt;
&lt;p&gt;The project uses the following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Java 8 - JDK 8&lt;&#x2F;li&gt;
&lt;li&gt;Spigot 1.8.9 library&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;paulcomte&#x2F;NarutoUHC&#x2F;commit&#x2F;3e0a2f77ed05f7e3d082c5fb1ede6911a50384b3&quot;&gt;First commit&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
</feed>
