Discordログ→どどんとふ風ログコンバータ

#はじめに
###TRPGer向け
Discordで交わしたテキストセッションログを、どどんとふ風ログに変換するツールとして
個人用に作ったものを、TRPG仲間のために公開しているものです。
現時点では使い辛いかと思いますので、[マシュマロ](https://marshmallow-qa.com/midtrpg?utm_medium=url_text&utm_source=promotion)等でドンドン意見をください。
気が向いたらアップデートします。

###プログラマ向け
コードが美しくない、説明がわかりにくい等の指摘を歓迎しています。


##使うもの
・DiscordChatExporter
：Discordからログを取るツールです。
　日付フォーマットは`yyyy-MM-dd HH:mm:ss`にしてください。
　それ以上に説明をここに述べた方が良かったら言ってください。とりあえず省略しています。
・RStudio
：ログを変換するために使用しているプログラム言語、及びそれを使いやすくするGUIです。
　説明をここに述べた方が良かったら言ってください。とりあえず省略しています。

#使い方
##初回セットアップ
###DiscordChatExporterセットアップ編
1. DiscordChatExporter.exeを起動
2. DiscordChatExporterについての説明が行われているサイトに従ってトークンを入力
3. 右上の歯車マークから、日付フォーマットを`yyyy-MM-dd HH:mm:ss`にする

###RStudioセットアップ編
[R言語本体とRStudio](https://qiita.com/hujuu/items/ddd66ae8e6f3f989f2c0)をインストール
任意で新規プロジェクト作成＆作業ディレクトリ指定

リンク先は@hujuuさんの記事です。

####新規プロジェクト作成＆作業ディレクトリ指定のやり方
左上のFile→NewProject→NewDirectory→NewProjectへ進む。
`Directory name`へ任意の名前を付け、出力したログを置く場所を
`Create project as subdirectory of:`で指定する。

###関数登録編
変換プログラム本体にある`colors_pre`をRStudioにコピペ。エンターキーで実行。
`log_conv_discold`も同じように実行。
RStudioのFunctionsの欄を見て、clolrs_preとlog_conv_discoldが登録されているのを確認。

＊次回からはここまで省略可能
　[毎回作業すること](#毎回作業すること)以降のみでOK

#変換プログラム本体
最終更新：10/29 1:54
<details><summary>折りたたみ（クリックで展開）</summary><div>

```R:colors_pre
colors_pre <- function(x) {
    namecolor <- 0:x
    name <- 0:x
    namecolor[1] <- "#00aa00"
    name[1] <- readline("systemname : ")
    for (i in 1:x+1) {
        name[i] <- readline("name : ")
        namecolor[i] <- readline("HTMLcolor : ")
    }
    names(namecolor) <- name
    namecolor <<- namecolor
    return(namecolor)
}
```

```R:log_conv_discord
log_conv_discord <- function(x = "log0", y = 1, namecolor = TRUE, date = 0){
    op <- c("<?xml version='1.0' encoding='UTF-8'?>",
            "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>",
            "<html xmlns='http://www.w3.org/1999/xhtml' lang='ja'>",
            "  <head>",
            "    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />",
            "    <title>chatlog : null</title>",
            "  </head>",
            "  <body>")
    op <- iconv(op, from = "CP932", to = "utf-8")
    end <- c("  </body>",
             "</html>")
    end <- iconv(end, from = "CP932", to = "utf-8")
    #csv <- read.csv(paste0(x, ".csv"), fileEncoding = "utf8")
    csv <- x
    taleker <- 1:nrow(csv)
    color <- 0
    if (is.logical(namecolor) == TRUE) {
        namecolor <- colors_pre(y)
    }
    if (date == 0) {
        csv["Date"] <- " "
        } else if (date == 1) {
            csv["Date"] <- lapply(csv["Date"], str_sub, start = 12, end = -4)
        } else if (date == 2) {
            csv["Date"] <- lapply(csv["Date"], str_sub, start = 6, end = -4)
    }
    for (i in 1:nrow(csv)) {
        for (j in 1:length(namecolor)) {
            if (csv[i,2] == names(namecolor)[j]) {
                #return(csv[i,2] == names(namecolor)[j])
                color <- namecolor[j]
                break
            } else {
                color <- "#000000"
            }
        }
        taleker[i] <- paste0("[", csv[i,6], "]", as.character(csv[i,3]), "：<font color='", color, "'><b>", csv[i,2], "</b>：", as.character(csv[i,4]), "</font><br>")
    }
    html <- c(op, taleker, end)
    write(html, "test0.html", append = F)
    #write(html, file = paste0(x, ".html"), append = F)
    #html <- data.frame(c(op, taleker, end))
    #write.table(html, file = paste0(x, ".html"), fileEncoding = "utf-8", append = F)
}
```
</div></details>

##毎回作業すること
###ログ取得編

1. DiscordChatExporter.exeを起動
2. 好みで範囲を日時で区切っておく　※省略可能
3. ログを変換したい対象のDM/鯖から「csv形式」でログを入手する
4. 作業ディレクトリ（[新規プロジェクト作成＆作業ディレクトリ指定のやり方](#新規プロジェクト作成作業ディレクトリ指定のやり方)で指定した場所）へログを置く

###RStudio上でやること
一行ずつコピペして実行。

```R
install.packages("tidyverse")
library(tidyverse)
#RStudio起動後、インストール・ライブラリ済なら省略可能

x <- 人数  #半角数字。例：x <- 9
colors_pre(x)
#systemneme:　ダイスbotのなどシステム名を入れることが推奨だが、無記入のままエンターキーでも良い。
#"name : "　に発言者の名前（かな・カナ・漢字可能）、"HTMLcolor : "　に付けたい色のカラーコードを書いてエンターキー

log <- "ログ名" 
#※「ログ取得編の4.」で置いたログファイル名にする。半角英数字のみを推奨
#半角ダブルクォーテーションは絶対に外さない。
log <- read.csv(paste0(log, ".csv"), fileEncoding = "utf8")
log["Author"] <- lapply(log["Author"], str_sub, start = 1, end = -6)

log_conv_discord(log, , namecolor)
#第四引数に1と入力すると時分のタイムスタンプ、2と入力すると更に月日も表示される。
#log_conv_discord(log, , namecolor, 1)　などとすればよい。
```

#後処理

出来あがったファイル「test0.html」をテキストエディタで開き、
エンコードを「UTF-8」に変更して保存してください。



#複数チャンネルを複数タブ化する場合でのコード
[毎回作業すること](#毎回作業すること)の代わりに以下を行う。


DiscordChatExporterで必要なログを取得。作業ディレクトリへ置く。

今回は以下折りたたみのcsvを用いた場合で解説。
<details><summary>csv折りたたみ（クリックで展開）</summary><div>

```csvs:メイン
AuthorID,Author,Date,Content,Attachments,Reactions
"******************","カナ#0000","2020-10-28 15:00:00","ﾈｺ","",""
"******************","かな#0000","2020-10-28 19:00:00","せ","",""
```

```csvs:雑談
AuthorID,Author,Date,Content,Attachments,Reactions
"******************","かな#0000","2020-10-28 20:00:00","よ","",""
```

```csvs:損傷・使用
AuthorID,Author,Date,Content,Attachments,Reactions
"******************","漢字#0000","2020-10-28 18:00:00","解","",""
```

```csvs:お祓い
AuthorID,Author,Date,Content,Attachments,Reactions
"******************","かな#0000","2020-10-28 16:00:00","と","",""
```

```csvs:見学用
AuthorID,Author,Date,Content,Attachments,Reactions
"******************","漢字#0000","2020-10-28 17:00:00","和","",""
```

</div></details>

ファイル名をそれぞれ1, 2, 3, 5, 7に変更。
全角ではなく半角数字にすること。`.csv`は変えない。

```R
install.packages("tidyverse")
library(tidyverse)
#RStudio起動後、インストール・ライブラリ済なら省略可能

log1 <- read.csv("1.csv", fileEncoding = "utf8")
log2 <- read.csv("2.csv", fileEncoding = "utf8")
log3 <- read.csv("3.csv", fileEncoding = "utf8")
log5 <- read.csv("5.csv", fileEncoding = "utf8")
log7 <- read.csv("7.csv", fileEncoding = "utf8")

log1[,6] <- "メイン"
log2[,6] <- "雑談"
log3[,6] <- "損傷・使用"
log5[,6] <- "お祓い"
log7[,6] <- "見学用"

log0 <- rbind(log1,log2,log3,log5,log7)
log0[,3] <- as.POSIXct(log0[,3])
log0 <- log0[order(log0$Date),]

log0["Author"] <- lapply(log0["Author"], str_sub, start = 1, end = -6)

log_conv_discord(log0,3)
```
systemname :　が出たら、以下を最初の空行含めて張り付けることで一回のコピペで複数人の名前と色の紐づけを一気にできる。

```


かな
#556b2f
カナ
#ff8c00
漢字
#0000cd
```

[後処理](#後処理)をして完成。
![sample-html02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188393/c44d3c2f-270b-f9a5-198a-852695bda913.jpeg)


#付録：改行やその他マークダウンをhtmlに変換する、テキストエディタでの正規表現を利用した置換用のテキスト
動作保証：サクラエディタ

```
検索：
^([^\d\d:\d\d])
^([^\d\d\-\d\d\s\d\d:\d\d])
^([^\[])
#時分のタイムスタンプが残っているなら１番目、月日時分が残っているなら２番目、タイムスタンプが一切なく[メイン]などから始まる場合は３番目が良い
置換：
<br>${1}

検索：
\*\*([^*]+?)\*\*
置換：
<b>${1}</b>

検索：
~~([^~]+?)~~
置換：

${1}


検索：
\_\_([^\_]+?)\_\_
置換：
<u>${1}</u>
```

#動作に異常があったら？
[変換プログラム本体](#変換プログラム本体)の中の`log_conv_discord`をもう一度コピペ、実行。
[RStudio上でやること](#rstudio上でやること)もしくは[複数チャンネルを複数タブ化する場合でのコード](#複数チャンネルを複数タブ化する場合でのコード)に戻り再びコピペ、実行。
ログの取得～ファイル名変更はしなくてよい。

### 'str_sub' を含むエラーが出た場合
```R
install.packages("tidyverse")
library(tidyverse)
#RStudio起動後、インストール・ライブラリ済なら省略可能
```
ここからやり直す。
####謝辞
当記事の説明文、及び機能改善に多大に協力頂いたM氏に感謝します。