support for changing online status

This commit is contained in:
Florian Stinglmayr 2019-07-23 18:37:11 +02:00
parent 95d23bf6a9
commit 318c874dc6
10 changed files with 137 additions and 5 deletions

View File

@ -103,17 +103,21 @@ guild names, or user names are all case sensitive.
| /ack | Mark channel as read | | WIP |
| /close | Close current channel view | | |
| /connect | Connect as the given account | account, as named in config | |
| /dnd | Mark yourself as do not disturb | | |
| /friend | List all friends | | |
| /friend accept | Accept a friend request | full discord name, i.e. name#XXXX | |
| /friend add | Add a friend | full discord name, i.e. name#XXXX | |
| /friend list | List all friends | | |
| /friend remove | Remove a friend | full discord name, i.e. name#XXXX | |
| /friends | Alias for "/friend" | | |
| /idle | Mark yourself as idle | | |
| /invisible | Mark yourself as invisible | | |
| /join | Join a guild channel | "guild name" "channel name" | |
| /login | Alias for /connect | | |
| /logout | Log current user out | | |
| /markread | Alias for /ack | | WIP |
| /msg | Private message a friend | full discord name, i.e. name#XXXX | |
| /online | Mark yourself as online | | |
| /post | Post a message to current channel | full message to post | |
| /quit | Exit, and quit | | |
| /wc | Alias for /close | | |

View File

@ -31,6 +31,11 @@
#include <event.h>
#include <glib.h>
#define DC_API_USER_STATUS_ONLINE "online"
#define DC_API_USER_STATUS_IDLE "idle"
#define DC_API_USER_STATUS_DND "dnd"
#define DC_API_USER_STATUS_INVISIBLE "invisible"
struct dc_api_;
typedef struct dc_api_ *dc_api_t;
@ -93,6 +98,14 @@ bool dc_api_get_userinfo(dc_api_t api, dc_account_t login,
bool dc_api_get_userguilds(dc_api_t api, dc_account_t login,
GPtrArray **guilds);
/**
* Set the online status of the currently logged in user "login". "status" must
* be one of the valid string macros defined in this header, or the function
* fails.
*/
bool dc_api_set_user_status(dc_api_t api, dc_account_t login,
char const *status);
/**
* Create a 1:1 or 1:N DM channel with the given recipients. The recipients must
* have their ID (snowflake) set. Returns the new channel, complete with ID, and

View File

@ -19,6 +19,40 @@
#include <dc/api.h>
#include "internal.h"
bool dc_api_set_user_status(dc_api_t api, dc_account_t login,
char const *status)
{
char const *url = "users/@me/settings";
json_t *reply = NULL, *data = NULL;
bool ret = false;
return_if_true(api == NULL || login == NULL || status == NULL, false);
if (strcmp(status, DC_API_USER_STATUS_ONLINE) != 0 &&
strcmp(status, DC_API_USER_STATUS_IDLE) != 0 &&
strcmp(status, DC_API_USER_STATUS_DND) != 0 &&
strcmp(status, DC_API_USER_STATUS_INVISIBLE) != 0) {
return false;
}
data = json_object();
goto_if_true(data == NULL, cleanup);
json_object_set_new(data, "status", json_string(status));
reply = dc_api_call_sync(api, "PATCH", TOKEN(login), url, data);
goto_if_true(reply != NULL, cleanup);
ret = true;
cleanup:
json_decref(reply);
json_decref(data);
return ret;
}
bool dc_api_get_userinfo(dc_api_t api, dc_account_t login,
dc_account_t user)
{
@ -36,7 +70,7 @@ bool dc_api_get_userinfo(dc_api_t api, dc_account_t login,
asprintf(&url, "users/%s", dc_account_id(user));
}
reply = dc_api_call_sync(api, "GET", dc_account_token(login), url, NULL);
reply = dc_api_call_sync(api, "GET", TOKEN(login), url, NULL);
goto_if_true(reply == NULL, cleanup);
val = json_object_get(reply, "username");
@ -74,7 +108,7 @@ bool dc_api_get_userguilds(dc_api_t api, dc_account_t login, GPtrArray **out)
return_if_true(api == NULL, false);
return_if_true(login == NULL, false);
reply = dc_api_call_sync(api, "GET", dc_account_token(login), url, NULL);
reply = dc_api_call_sync(api, "GET", TOKEN(login), url, NULL);
goto_if_true(reply == NULL, cleanup);
goto_if_true(!json_is_array(reply), cleanup);

View File

@ -185,7 +185,8 @@ dc_api_do(dc_api_t api, char const *verb,
}
if (strcmp(verb, "PUT") == 0 ||
strcmp(verb, "DELETE") == 0) {
strcmp(verb, "DELETE") == 0 ||
strcmp(verb, "PATCH") == 0) {
curl_easy_setopt(c, CURLOPT_CUSTOMREQUEST, verb);
}

View File

@ -28,6 +28,7 @@ SET(SOURCES
"src/msg.c"
"src/ncdc.c"
"src/post.c"
"src/status.c"
"src/textview.c"
"src/treeview.c"
"src/util.c"

View File

@ -50,11 +50,15 @@ ncdc_commands_t *ncdc_find_cmd(ncdc_commands_t *cmds, wchar_t const *name);
bool ncdc_cmd_ack(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_close(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_dnd(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_friends(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_idle(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_invisible(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_join(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_login(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_logout(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_msg(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_online(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_post(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);
bool ncdc_cmd_quit(ncdc_mainwindow_t n, size_t ac, wchar_t **av, wchar_t const *f);

View File

@ -55,6 +55,9 @@
#define return_if_true(v,r) do { if (v) return r; } while(0)
#define goto_if_true(v,l) do { if (v) goto l; } while(0)
/* NCDC_DEBUG variable */
/*#define NCDC_DEBUG*/
typedef enum {
ncdc_colour_separator = 1,
ncdc_colour_treehighlight = 2,

View File

@ -22,13 +22,17 @@ ncdc_commands_t cmds[] = {
{ L"/ack", ncdc_cmd_ack },
{ L"/close", ncdc_cmd_close },
{ L"/connect", ncdc_cmd_login },
{ L"/dnd", ncdc_cmd_dnd },
{ L"/friend", ncdc_cmd_friends },
{ L"/friends", ncdc_cmd_friends },
{ L"/idle", ncdc_cmd_idle },
{ L"/invisible",ncdc_cmd_invisible },
{ L"/join", ncdc_cmd_join },
{ L"/login", ncdc_cmd_login },
{ L"/logout", ncdc_cmd_logout },
{ L"/markread", ncdc_cmd_ack },
{ L"/msg", ncdc_cmd_msg },
{ L"/online", ncdc_cmd_online },
{ L"/post", ncdc_cmd_post },
{ L"/quit", ncdc_cmd_quit },
{ L"/wc", ncdc_cmd_close },

View File

@ -406,7 +406,7 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
}
keylen = wcslen(key);
#if 0
#ifdef NCDC_DEBUG
FILE *f = fopen("keys.txt", "a+");
fwprintf(f, L"KEY: %02X %ls\n",
key[0], &key[1]
@ -415,7 +415,7 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
#endif
}
#if 0
#ifdef NCDC_DEBUG
FILE *f = fopen("keys.txt", "a+");
fwprintf(f, L"%X\n", i);
fclose(f);

68
ncdc/src/status.c Normal file
View File

@ -0,0 +1,68 @@
/*
* Part of ncdc - a discord client for the console
* Copyright (C) 2019 Florian Stinglmayr <fstinglmayr@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <ncdc/ncdc.h>
#include <ncdc/cmds.h>
bool ncdc_cmd_idle(ncdc_mainwindow_t n, size_t ac, wchar_t **av,
wchar_t const *f)
{
bool ret = false;
ret = dc_api_set_user_status(dc_session_api(current_session),
dc_session_me(current_session),
DC_API_USER_STATUS_IDLE
);
return ret;
}
bool ncdc_cmd_online(ncdc_mainwindow_t n, size_t ac, wchar_t **av,
wchar_t const *f)
{
bool ret = false;
ret = dc_api_set_user_status(dc_session_api(current_session),
dc_session_me(current_session),
DC_API_USER_STATUS_ONLINE
);
return ret;
}
bool ncdc_cmd_invisible(ncdc_mainwindow_t n, size_t ac, wchar_t **av,
wchar_t const *f)
{
bool ret = false;
ret = dc_api_set_user_status(dc_session_api(current_session),
dc_session_me(current_session),
DC_API_USER_STATUS_INVISIBLE
);
return ret;
}
bool ncdc_cmd_dnd(ncdc_mainwindow_t n, size_t ac, wchar_t **av,
wchar_t const *f)
{
bool ret = false;
ret = dc_api_set_user_status(dc_session_api(current_session),
dc_session_me(current_session),
DC_API_USER_STATUS_DND
);
return ret;
}