From 86b1bea52dd397696931ccebdc79e4cd58d7e05c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Fri, 18 Aug 2023 13:23:30 +0900 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E5=88=9D=E3=82=B3=E3=83=9F=E3=83=83?= =?UTF-8?q?=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ Makefile | 19 +++++++++ main.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b7fbaf2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.so +weechat-* +core diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3b231be --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +CC = gcc +TARGET = weechat-chatwork.so +PREFIX = /usr +LIBDIR = $(PREFIX)/lib/weechat/plugins +DEBUG = -Wall -g +CFLAGS = -fPIC -I$(PREFIX)/include/weechat +LDFLAGS = -shared -lcurl -lcjson + +all: $(TARGET) + +$(TARGET): main.c + $(CC) $(DEBUG) $(CFLAGS) $(LDFLAGS) -o $@ $< + +install: + install -d $(LIBDIR) + install -m 755 $(TARGET) $(LIBDIR) + +clean: + rm -f $(TARGET) diff --git a/main.c b/main.c new file mode 100644 index 0000000..e74e427 --- /dev/null +++ b/main.c @@ -0,0 +1,122 @@ +#include +#include +#include +#include +#include + +WEECHAT_PLUGIN_NAME("chatwork"); +WEECHAT_PLUGIN_DESCRIPTION("Chatwork対応"); +WEECHAT_PLUGIN_AUTHOR("洩矢諏訪子 "); +WEECHAT_PLUGIN_VERSION("0.1"); +WEECHAT_PLUGIN_LICENSE("GPL3"); + +struct t_config_file *chatwork_config_file = NULL; +struct t_config_option *chatwork_config_token = NULL; +struct t_weechat_plugin *weechat_plugin = NULL; + +typedef struct { + const char *url; + const char *token; +} ApiRequest; + +typedef struct { + CURLcode result; + char *data; +} ApiResponse; + +ApiResponse makeApiRequest (const ApiRequest *request) { + // TODO +} + +size_t WriteCallback (void* contents, size_t size, size_t nmemb, void* userp) { + size_t totalSize = size * nmemb; + char** buffer_ptr = (char**)userp; + char* temp = realloc(*buffer_ptr, strlen(*buffer_ptr) + totalSize + 1); + if (temp == NULL) return 0; + *buffer_ptr = temp; + memcpy(*buffer_ptr + strlen(*buffer_ptr), contents, totalSize); + (*buffer_ptr)[strlen(*buffer_ptr) + totalSize] = '\0'; + return totalSize; +} + +int chatwork_command_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { + weechat_printf(buffer, "Chatworkコマンドを実行しました。\n"); + const char *token = weechat_config_string(chatwork_config_token); + if (!token || strlen(token) == 0) { + weechat_printf(buffer, "トークンを見つけられませんでした。\n"); + return WEECHAT_RC_ERROR; + } + + CURL *curl = curl_easy_init(); + if (!curl) { + weechat_printf(buffer, "libcurlを起動出来なかった。\n"); + return WEECHAT_RC_ERROR; + } + + char *readBuffer = calloc(1, 1); + curl_easy_setopt(curl, CURLOPT_URL, "https://api.chatwork.com/v2/me"); + + struct curl_slist *headers = NULL; + char header[256]; + snprintf(header, sizeof(header), "X-ChatWorkToken: %s", token); + headers = curl_slist_append(headers, header); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); + + CURLcode res = curl_easy_perform(curl); + if (res != CURLE_OK) { + weechat_printf(buffer, "GETリクエストエラー:%s\n", curl_easy_strerror(res)); + } else { + cJSON *root = cJSON_Parse(readBuffer); + if (root != NULL) { + const char *name = cJSON_GetObjectItem(root, "name")->valuestring; + weechat_printf(buffer, "GETリクエストに成功:%s\n", name); + cJSON_Delete(root); + } else { + weechat_printf(buffer, "JSONパーシングエラー。\n"); + } + } + + // 掃除 + curl_slist_free_all(headers); + curl_easy_cleanup(curl); + free(readBuffer); + + return WEECHAT_RC_OK; +} + +int weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) { + weechat_plugin = plugin; + + // コンフィグファイル + chatwork_config_file = weechat_config_new("weechat-chatwork", NULL, NULL, NULL); + if (!chatwork_config_file) { + return WEECHAT_RC_ERROR; + } + + struct t_config_section *section; + section = weechat_config_new_section(chatwork_config_file, "general", 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + if (!section) { + weechat_config_free(chatwork_config_file); + return WEECHAT_RC_ERROR; + } + + chatwork_config_token = weechat_config_new_option(chatwork_config_file, section, "token", "string", "Chatwork API token.", NULL, 0, 0, "", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + if (weechat_config_read(chatwork_config_file) != WEECHAT_CONFIG_READ_OK) { + weechat_printf(NULL, "%s コンフィグファイルを読み込みに失敗。", weechat_prefix("error")); + return WEECHAT_RC_ERROR; + } + + // /chatworkコマンドを登録 + weechat_hook_command("chatwork", "Chatwork コマンド", "[arguments]", "コマンドの説明", NULL, &chatwork_command_cb, NULL, NULL); + + return WEECHAT_RC_OK; +} + +int weechat_plugin_end (struct t_weechat_plugin *plugin) { + // TODO + weechat_config_free(chatwork_config_file); + return WEECHAT_RC_OK; +}