summaryrefslogtreecommitdiff
path: root/libs/libtox/docs/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libtox/docs/README.md')
-rw-r--r--libs/libtox/docs/README.md174
1 files changed, 174 insertions, 0 deletions
diff --git a/libs/libtox/docs/README.md b/libs/libtox/docs/README.md
new file mode 100644
index 0000000000..7a1ffe7ffa
--- /dev/null
+++ b/libs/libtox/docs/README.md
@@ -0,0 +1,174 @@
+# ![Project Tox](https://raw.github.com/TokTok/toxcore/master/other/tox.png "Project Tox")
+
+**Current build status:** [![Build Status](https://travis-ci.org/TokTok/c-toxcore.svg?branch=master)](https://travis-ci.org/TokTok/c-toxcore)
+**Current Coverage:** [![Coverage Status](https://coveralls.io/repos/github/TokTok/toxcore/badge.svg?branch=master)](https://coveralls.io/github/TokTok/toxcore?branch=master)
+
+[**Website**](https://tox.chat) **|** [**Wiki**](https://wiki.tox.chat/) **|** [**Blog**](https://blog.tox.chat/) **|** [**FAQ**](https://wiki.tox.chat/doku.php?id=users:faq) **|** [**Binaries/Downloads**](https://wiki.tox.chat/Binaries) **|** [**Clients**](https://wiki.tox.chat/doku.php?id=clients) **|** [**Compiling**](/INSTALL.md)
+
+**IRC Channels:** Users: [#tox@freenode](https://webchat.freenode.net/?channels=tox), Developers: [#toktok@freenode](https://webchat.freenode.net/?channels=toktok)
+
+## What is Tox
+
+Tox is a peer to peer (serverless) instant messenger aimed at making security
+and privacy easy to obtain for regular users. It uses
+[NaCl](https://nacl.cr.yp.to/) for its encryption and authentication.
+
+## IMPORTANT!
+
+### ![Danger: Experimental](other/tox-warning.png)
+
+This is an **experimental** cryptographic network library. It has not been
+formally audited by an independent third party that specializes in
+cryptography or cryptanalysis. **Use this library at your own risk.**
+
+The underlying crypto library [NaCl](https://nacl.cr.yp.to/install.html)
+provides reliable encryption, but the security model has not yet been fully
+specified. See [issue 210](https://github.com/TokTok/c-toxcore/issues/210) for
+a discussion on developing a threat model. See other issues for known
+weaknesses (e.g. [issue 426](https://github.com/TokTok/c-toxcore/issues/426)
+describes what can happen if your secret key is stolen).
+
+## Toxcore Development Roadmap
+
+The roadmap and changelog are generated from GitHub issues. You may view them
+on the website, where they are updated at least once every 24 hours:
+
+- Changelog: https://toktok.ltd/changelog/c-toxcore
+- Roadmap: https://toktok.ltd/roadmap/c-toxcore
+
+## Installing toxcore
+
+Detailed installation instructions can be found in [INSTALL.md](INSTALL.md).
+
+In a nutshell, if you have [libsodium](https://github.com/jedisct1/libsodium)
+or [nacl](https://nacl.cr.yp.to/install.html) installed, run:
+
+```sh
+autoreconf -fi
+mkdir _build && cd _build
+../configure
+make
+sudo make install
+```
+
+If you have [libvpx](https://github.com/webmproject/libvpx) and
+[opus](https://github.com/xiph/opus) installed, the above will also build the
+A/V library for multimedia chats.
+
+## Using toxcore
+
+The simplest "hello world" example could be an echo bot. Here we will walk
+through the implementation of a simple bot.
+
+### Creating the tox instance
+
+All toxcore API functions work with error parameters. They are enums with one
+`OK` value and several error codes that describe the different situations in
+which the function might fail.
+
+```c
+TOX_ERR_NEW err_new;
+Tox *tox = tox_new(NULL, &err_new);
+if (err_new != TOX_ERR_NEW_OK) {
+ fprintf(stderr, "tox_new failed with error code %d\n", err_new);
+ exit(1);
+}
+```
+
+Here, we simply exit the program, but in a real client you will probably want
+to do some error handling and proper error reporting to the user. The `NULL`
+argument given to the first parameter of `tox_new` is the `Tox_Options`. It
+contains various write-once network settings and allows you to load a
+previously serialised instance. See [toxcore/tox.h](tox.h) for details.
+
+### Setting up callbacks
+
+Toxcore works with callbacks that you can register to listen for certain
+events. Examples of such events are "friend request received" or "friend sent
+a message". Search the API for `tox_callback_*` to find all of them.
+
+Here, we will set up callbacks for receiving friend requests and receiving
+messages. We will always accept any friend request (because we're a bot), and
+when we receive a message, we send it back to the sender.
+
+```c
+tox_callback_friend_request(tox, handle_friend_request);
+tox_callback_friend_message(tox, handle_friend_message);
+```
+
+These two function calls set up the callbacks. Now we also need to implement
+these "handle" functions.
+
+### Handle friend requests
+
+```c
+static void handle_friend_request(
+ Tox *tox, const uint8_t *public_key, const uint8_t *message, size_t length,
+ void *user_data) {
+ // Accept the friend request:
+ TOX_ERR_FRIEND_ADD err_friend_add;
+ tox_friend_add_norequest(tox, public_key, &err_friend_add);
+ if (err_friend_add != TOX_ERR_FRIEND_ADD_OK) {
+ fprintf(stderr, "unable to add friend: %d\n", err_friend_add);
+ }
+}
+```
+
+The `tox_friend_add_norequest` function adds the friend without sending them a
+friend request. Since we already got a friend request, this is the right thing
+to do. If you wanted to send a friend request yourself, you would use
+`tox_friend_add`, which has an extra parameter for the message.
+
+### Handle messages
+
+Now, when the friend sends us a message, we want to respond to them by sending
+them the same message back. This will be our "echo".
+
+```c
+static void handle_friend_message(
+ Tox *tox, uint32_t friend_number, TOX_MESSAGE_TYPE type,
+ const uint8_t *message, size_t length,
+ void *user_data) {
+ TOX_ERR_FRIEND_SEND_MESSAGE err_send;
+ tox_friend_send_message(tox, friend_number, type, message, length,
+ &err_send);
+ if (err_send != TOX_ERR_FRIEND_SEND_MESSAGE_OK) {
+ fprintf(stderr, "unable to send message back to friend %d: %d\n",
+ friend_number, err_send);
+ }
+}
+```
+
+That's it for the setup. Now we want to actually run the bot.
+
+### Main event loop
+
+Toxcore works with a main event loop function `tox_iterate` that you need to
+call at a certain frequency dictated by `tox_iteration_interval`. This is a
+polling function that receives new network messages and processes them.
+
+```c
+while (true) {
+ usleep(1000 * tox_iteration_interval(tox));
+ tox_iterate(tox, NULL);
+}
+```
+
+That's it! Now you have a working echo bot. The only problem is that since Tox
+works with public keys, and you can't really guess your bot's public key, you
+can't add it as a friend in your client. For this, we need to call another API
+function: `tox_self_get_address(tox, address)`. This will fill the 38 byte
+friend address into the `address` buffer. You can then display that binary
+string as hex and input it into your client. Writing a `bin2hex` function is
+left as exercise for the reader.
+
+We glossed over a lot of details, such as the user data which we passed to
+`tox_iterate` (passing `NULL`), bootstrapping into an actual network (this bot
+will work in the LAN, but not on an internet server) and the fact that we now
+have no clean way of stopping the bot (`while (true)`). If you want to write a
+real bot, you will probably want to read up on all the API functions. Consult
+the API documentation in [toxcore/tox.h](tox.h) for more information.
+
+### Other resources
+
+- [Another echo bot](https://wiki.tox.chat/developers/client_examples/echo_bot)