aboutsummaryrefslogtreecommitdiff
path: root/v2/README.md
blob: 8e45866df1e995cfe1f58e889db84b5ca386b4dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Chatty
The idea is the following:
- tcp server that you can send messages to
- history upon connecting
- date of messages sent
- client for reading the messages and sending them at the same time
- rooms
- encryption
- authentication

## client
- [x] prompt
- [x] sending message
- [x] bug: do not allow sending empty message
- [x] wrapping messages
- [x] bug: when sending message after diconnect (serverfd?)

## server
- [ ] log messages to file (save history)
- [ ] check if when sending and the client is offline (due to connection loss) what happens
- [ ] timeout on recv?

## common
- [ ] handle messages that are too large
- [ ] connect/disconnections messages
- [ ] use IP address / domain
- [ ] chat history

## Protocol
For now the protocol consists of sending Message type over the network, but in the future something
more flexible might be required.  Because it will make it easier to do things like:
- request chat logs up to a certain point
- connect to a specific room
- connect/disconnect messages

- The null terminator must be sent with the string.
- The text can be arbitrary length

- [ ] compression

## Arena's
1. There is an arena for the messages' texts (`msgTextArena`) and an arena for the messages
   (`msgsArena`).
2. The `Message.text` pointer will point to a text buffer entry in `msgTextArena`
3. Good way to do this, if you have message `M`.
```c
M.text = ArenaPush(msgTextArena, M.text_len);
```
Notice, that this depends on knowing the text's length before allocating the memory.

## Strings
- the length of a string (eg. `Message.text_len`) always **excludes** the null terminator unless stated explicitly
- the `#define *_LEN` are the max length **including** the null terminator 

## Keybinds
- `Ctrl+C` | `Ctrl+D`: quits
- `Ctrl+U`: Erase input line
- `Ctrl+W`: Erase word behind cursor


## Resources I used for building this
- source code I looked at:
    - https://github.com/git-bruh/matrix-tui
    - https://github.com/NikitaIvanovV/ictree
    - https://github.com/termbox/termbox2
- *mmap & gdb*: [Tsoding - "Why linux has this syscall?" ](https://youtu.be/sFYFuBzu9Ow?si=CX32IzFVA8OPDZvS)
- *pthreads*: [C for dummies](https://c-for-dummies.com/blog/?p=5365)
- *unicode and wide characters*: [C for dummies](https://c-for-dummies.com/blog/?p=2578)
- *sockets*: [Nir Lichtman - Making Minimalist Chat Server in C on Linux](https://www.youtube.com/watch?v=gGfTjKwLQxY)
- syscall manpages