{"id":4583,"date":"2025-06-03T06:58:11","date_gmt":"2025-06-02T21:58:11","guid":{"rendered":"https:\/\/matoken.org\/blog\/?p=4583"},"modified":"2025-06-03T06:58:13","modified_gmt":"2025-06-02T21:58:13","slug":"save-galene-text-chat-with-go-library","status":"publish","type":"post","link":"https:\/\/matoken.org\/blog\/2025\/06\/03\/save-galene-text-chat-with-go-library\/","title":{"rendered":"Galene\u306e\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u3092Go\u88fd\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u4fdd\u5b58"},"content":{"rendered":"<p><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" d=\"M4 10a2 2 0 0 1 2-2h28a2 2 0 0 1 2 2v9l8-6v23l-8-6v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2zm6 6v4m5-6v8m5-6v4\"\/><\/svg><!-- icon-park-outline:video-conference --><\/p>\n<div class=\"paragraph\">\n<p>Galene\u3068\u3044\u3046\u30d3\u30c7\u30aa\u30ab\u30f3\u30d5\u30a1\u30ec\u30f3\u30b9\u30b5\u30fc\u30d0\u30fc\u304c\u3042\u308a\u307e\u3059\uff0eWebRTC\u306e<a href=\"https:\/\/bloggeek.me\/webrtcglossary\/sfu\/\">SFU<\/a>\u3092\u5229\u7528\u3057\uff0c\u4f4e\u30b9\u30da\u30c3\u30af\u306a\u30b5\u30fc\u30d0\u30fc\u3067\u3082\u52d5\u4f5c\u3059\u308b\u306e\u3067\u30bb\u30eb\u30d5\u30db\u30b9\u30c8\u3057\u3066\u5229\u7528\u3057\u3066\u3044\u307e\u3059\uff0e<br \/>\nGalene\u306e\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u306e\u4fdd\u5b58\u3092\u3059\u308b\u306e\u306b\u30c1\u30e3\u30c3\u30c8\u6b04\u3092\u30b3\u30d4\u30fc&amp;\u30da\u30fc\u30b9\u30c8\u3057\u3066\u3044\u307e\u3059\u304c\u9762\u5012\u3067\u3059\u3057\u30b3\u30d4\u30fc\u3057\u5fd8\u308c\u3066\u3057\u307e\u3046\u3053\u3068\u3082\uff0e<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"https:\/\/galene.org\/\">Galene videoconference server<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>\u6700\u8fd1Galene\u306eGo\u88fdclient library\u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u305f\u306e\u3067\u3053\u308c\u3067\u30c1\u30e3\u30c3\u30c8\u3092\u4fdd\u5b58\u3067\u304d\u306a\u3044\u304b\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\uff0e<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"https:\/\/lists.galene.org\/galene\/87r006z4gs.wl-jch@irif.fr\/T\/#u\">[Galene] ANNOUNCE: Galene client library for Go<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p><!--more--><\/p>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"https:\/\/pkg.go.dev\/github.com\/jech\/gclient#Client.Chat\">gclient package &#8211; github.com\/jech\/gclient &#8211; Go Packages<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/jech\/gclient\">jech\/gclient: Client library for the Galene videoconference server<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>\u307e\u305a\u306fsource\u3092\u8cb0\u3063\u3066\u304d\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">$ git clone https:\/\/github.com\/jech\/gclient\n$ cd gclient<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>example\u4ee5\u4e0b\u3092\u898b\u308b\u3068chat.go\u3068\u3044\u3046\u3082\u306e\u304c\u3042\u308a\u307e\u3059\uff0e\u3053\u306e\u307e\u307e\u4f7f\u3048\u305d\u3046\u3067\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">$ go build examples\/chat\/chat.go\n$ .\/chat\nUsage: .\/chat group\n  -debug\n        enable protocol logging\n  -insecure\n        don't check server certificates\n  -password password\n        password to use for login\n  -username username\n        username to use for login (default \"chat-example\")<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Galene\u306egroup url\u3092\u6307\u5b9a\u3057\u3066\u5b9f\u884c\u3059\u308b\u3053\u3068\u3067\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u306e\u9001\u53d7\u4fe1\u304c\u3067\u304d\u307e\u3057\u305f\uff0e\u3053\u306e\u3068\u304d\u306e\u30e6\u30fc\u30b6\u540d\u306f`chat-example`\u306b\u306a\u308a\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">$ .\/chat https:\/\/www.kagolug.org:8443\/group\/test\/ <b class=\"conum\">(1)<\/b>\nuser: hello world! <b class=\"conum\">(2)<\/b>\nuser: \u65e5\u672c\u8a9e\nuser: \u7d75\u6587\u5b57&amp;#x1f3a8;\nhello <b class=\"conum\">(3)<\/b>\nchat-example: hello\n^C\n$ .\/chat https:\/\/www.kagolug.org:8443\/group\/test\/ <b class=\"conum\">(4)<\/b>\nuser: hello world!\nuser: \u65e5\u672c\u8a9e\nuser: \u7d75\u6587\u5b57&amp;#x1f3a8;\nchat-example: hello<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"colist arabic\">\n<ol>\n<li>\n<p>Galene\u306egroup url\u3092\u6307\u5b9a\u3057\u3066\u5b9f\u884c\uff0e<\/p>\n<\/li>\n<li>\n<p>Galene\u306e\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u304c\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306b\u8868\u793a\u3055\u308c\u308b\uff0e<\/p>\n<\/li>\n<li>\n<p>terminal\u304b\u3089chat\u3092\u9001\u4fe1\uff0e<\/p>\n<\/li>\n<li>\n<p>\u63a5\u7d9a\u3057\u76f4\u3059\u3068\u904e\u53bb\u306e(\u671f\u9650\u5207\u308c\u306b\u306a\u3063\u3066\u3044\u306a\u3044)chat log\u3082\u53d6\u5f97\u3067\u304d\u308b\uff0e<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>\u3044\u3044\u611f\u3058\u305d\u3046\u3067\u3059\uff0e\u3067\u3082\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u3082\u6b32\u3057\u3044\u3067\u3059\uff0e<br \/>\n\u3068\u3044\u3046\u3053\u3068\u3067\u5c11\u3057\u66f8\u304d\u63db\u3048\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-go\" data-lang=\"go\">$ git diff examples\/chat\/chat.go\ndiff --git a\/examples\/chat\/chat.go b\/examples\/chat\/chat.go\nindex 8c9211b..d2a637e 100644\n--- a\/examples\/chat\/chat.go\n+++ b\/examples\/chat\/chat.go\n@@ -107,11 +107,11 @@ outer:\n                                        fmt.Printf(\"* %v %v\\n\",\n                                                e.Username, e.Value,\n                                        )\n-                               } else if e.Username == \"\" {\n-                                       fmt.Printf(\"%v\\n\", e.Value)\n+\/\/                             } else if e.Username == \"\" {\n+\/\/                                     fmt.Printf(\"%v\\n\", e.Value)\n                                } else {\n-                                       fmt.Printf(\"%v: %v\\n\",\n-                                               e.Username, e.Value,\n+                                       fmt.Printf(\"%v %v: %v\\n\",\n+                                               e.Time, e.Username, e.Value,\n                                        )\n                                }\n                        case error:<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">$ go run examples\/chat\/chat.go https:\/\/www.kagolug.org:8443\/group\/test\/\n2025-06-03T05:16:04+09:00 user: hello world!\n2025-06-03T05:18:12+09:00 user: \u65e5\u672c\u8a9e\n2025-06-03T05:18:33+09:00 user: \u7d75\u6587\u5b57&amp;#x1f3a8;\n2025-06-03T05:18:45+09:00 chat-example: hello<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/matoken.org\/blog\/wp-content\/uploads\/2025\/06\/galene-chat_client.webp\" alt=\"galene chat client\"><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u3044\u3044\u611f\u3058\u305d\u3046\u3067\u3059\uff0e\u4eca\u5ea6\u306e\u30df\u30fc\u30c6\u30a3\u30f3\u30b0\u306b\u4f7f\u3063\u3066\u307f\u3088\u3046\u3068\u601d\u3044\u307e\u3059\uff0e<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">\u74b0\u5883<\/div>\n<div class=\"content\">\n<pre>$ git config remote.origin.url\nhttps:\/\/github.com\/jech\/gclient\n$ git log --pretty=oneline -1\ne8edc33fd3d81701c5bad61e9bdb9399cd4e5dc4 (HEAD -&gt; master, origin\/master, origin\/HEAD) Initial import.\n$ dpkg-query -W golang\ngolang:amd64    2:1.24~2\n$ go version\ngo version go1.24.2 linux\/amd64\n$ lsb_release -dr\nDescription:    Debian GNU\/Linux 13 (trixie)\nRelease:        13\n$ arch\nx86_64<\/pre>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Galene\u3068\u3044\u3046\u30d3\u30c7\u30aa\u30ab\u30f3\u30d5\u30a1\u30ec\u30f3\u30b9\u30b5\u30fc\u30d0\u30fc\u304c\u3042\u308a\u307e\u3059\uff0eWebRTC\u306eSFU\u3092\u5229\u7528\u3057\uff0c\u4f4e\u30b9\u30da\u30c3\u30af\u306a\u30b5\u30fc\u30d0\u30fc\u3067\u3082\u52d5\u4f5c\u3059\u308b\u306e\u3067\u30bb\u30eb\u30d5\u30db\u30b9\u30c8\u3057\u3066\u5229\u7528\u3057\u3066\u3044\u307e\u3059\uff0e Galene\u306e\u30c6\u30ad\u30b9\u30c8\u30c1\u30e3\u30c3\u30c8\u306e\u4fdd\u5b58\u3092\u3059\u308b\u306e\u306b\u30c1\u30e3\u30c3\u30c8\u6b04\u3092\u30b3\u30d4 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"webmentions_disabled_pings":false,"webmentions_disabled":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[7,6,199],"tags":[738,805],"class_list":["post-4583","post","type-post","status-publish","format-standard","hentry","category-debian-linux","category-linux","category-sid","tag-galene","tag-golang"],"_links":{"self":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/4583","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/comments?post=4583"}],"version-history":[{"count":3,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/4583\/revisions"}],"predecessor-version":[{"id":4586,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/posts\/4583\/revisions\/4586"}],"wp:attachment":[{"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/media?parent=4583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/categories?post=4583"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matoken.org\/blog\/wp-json\/wp\/v2\/tags?post=4583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}