support for changing online status
This commit is contained in:
parent
95d23bf6a9
commit
318c874dc6
@ -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 | | |
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 },
|
||||
|
@ -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
68
ncdc/src/status.c
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user