├── .gitmodules ├── .tar2package.yml ├── .travis.yml ├── LICENSE ├── Makefile ├── README.md ├── bin └── echo-meme ├── install.sh ├── man ├── echo-meme.1 └── man.md ├── pkg ├── echo-meme.deb └── echo-meme.rpm ├── script ├── crontab ├── genpkg.sh └── import_issue_batch.sh └── test └── test.sh /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "test/shunit2"] 2 | path = test/shunit2 3 | url = https://github.com/kward/shunit2.git 4 | -------------------------------------------------------------------------------- /.tar2package.yml: -------------------------------------------------------------------------------- 1 | name : echo-meme 2 | cmdname : echo-meme 3 | summary : Print your message as a part of various Japanese internet memes. 4 | description : Print your message as a part of various Japanese internet memes. 5 | version : 1.1.0 6 | changelog : Add new templates 7 | url : https://github.com/greymd/echo-meme 8 | author : Yasuhiro, Yamada 9 | email : yamada@gr3.ie 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: bash 2 | sudo: required 3 | 4 | services: 5 | - docker 6 | 7 | addons: 8 | apt: 9 | packages: 10 | # - shellcheck #Disable due to old version 11 | - libevent-dev 12 | - gcc 13 | - make 14 | - curl 15 | 16 | branches: 17 | only: 18 | - master 19 | - develop 20 | - /^develop-.*/ 21 | - /^bugfix.*/ 22 | - /^feature.*/ 23 | 24 | matrix: 25 | include: 26 | - os: linux 27 | env: SH_VERSION=3.2 28 | - os: linux 29 | env: SH_VERSION=4.0 30 | - os: linux 31 | env: SH_VERSION=4.1 32 | - os: linux 33 | env: SH_VERSION=4.2 34 | - os: linux 35 | env: SH_VERSION=4.3 36 | - os: linux 37 | env: SH_VERSION=4.4 38 | - os: linux 39 | env: SH_VERSION=5.0 40 | 41 | before_script: 42 | - export TMPDIR=$TRAVIS_BUILD_DIR/tmp 43 | - mkdir -p $TMPDIR 44 | - ( cd "$TMPDIR" && curl "http://ftp.gnu.org/gnu/bash/bash-${SH_VERSION}.tar.gz" | tar xvz && cd bash* && ./configure; make && sudo make install && sudo mv /bin/bash /bin/bash.old && sudo cp ./bash /bin/bash ) 45 | - docker pull koalaman/shellcheck:stable # Official docker container (v0.6.0 or later) 46 | 47 | script: 48 | - /bin/bash --version 49 | - docker run -v "$PWD:/mnt" koalaman/shellcheck ./bin/echo-meme 50 | - /bin/bash -n ./bin/echo-meme 51 | - /bin/bash ./test/test.sh 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Yasuhiro Yamada 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: packages 2 | 3 | echo-meme.tar.gz: .tar2package.yml 4 | tar zcvf echo-meme.tar.gz bin man .tar2package.yml 5 | 6 | packages: echo-meme.tar.gz 7 | cat echo-meme.tar.gz | docker run -i greymd/tar2rpm > ./pkg/echo-meme.rpm 8 | cat echo-meme.tar.gz | docker run -i greymd/tar2deb > ./pkg/echo-meme.deb 9 | 10 | clean: 11 | rm -f echo-meme.tar.gz 12 | 13 | .PHONY: clean all echo-meme.tar.gz packages 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # echo-meme 2 | 3 | [![Build Status](https://travis-ci.org/greymd/echo-meme.svg?branch=master)](https://travis-ci.org/greymd/echo-meme) 4 | ![LICENSE](http://img.shields.io/badge/license-MIT-blue.svg?style=flat) 5 | 6 | Print your message as a part of various Japanese internet memes. 7 | 8 | メッセージを様々な流行りのフレーズ、インターネットミームの一部に組み込んで出力するコマンドです。 9 | 10 | ``` 11 | $ echo-meme 山田 12 | むしゃむしゃしていた。山田なら何でもよかった。 13 | 14 | $ echo-meme 山田 15 | 見ろ!人が山田のようだ! 16 | ``` 17 | 18 | Tell us about your favorite memes ! ([Send request](https://github.com/greymd/echo-meme/issues/new?body=%74%65%6D%70%6C%61%74%65%3A%5B%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%96%87%E7%AB%A0%7B%7D%E3%80%82%7B%7D%E3%81%A8%E3%81%84%E3%81%86%E5%80%8B%E6%89%80%E3%81%8C%E5%BC%95%E6%95%B0%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%80%80%5D&title=%6E%65%77%5F%6D%65%6D%65%5F%72%65%71%75%65%73%74%3A%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%96%87%E7%AB%A0%7B%7D%E3%80%82%7B%2E%2E%2E)) 19 | 20 | あなたのお気に入りのミームを教えて下さい ! ([Send request](https://github.com/greymd/echo-meme/issues/new?body=%74%65%6D%70%6C%61%74%65%3A%5B%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%96%87%E7%AB%A0%7B%7D%E3%80%82%7B%7D%E3%81%A8%E3%81%84%E3%81%86%E5%80%8B%E6%89%80%E3%81%8C%E5%BC%95%E6%95%B0%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%80%80%5D&title=%6E%65%77%5F%6D%65%6D%65%5F%72%65%71%75%65%73%74%3A%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%96%87%E7%AB%A0%7B%7D%E3%80%82%7B%2E%2E%2E)). 21 | 22 | ## Installation 23 | 24 | ### Linux 25 | 26 | #### RHEL compatible distros 27 | 28 | ``` 29 | $ sudo yum install -y https://git.io/echo-meme.rpm 30 | ``` 31 | 32 | Execute same command agaiin to update. 33 | 34 | #### Debian base distros 35 | 36 | ``` 37 | $ wget https://git.io/echo-meme.deb 38 | $ sudo dpkg -i ./echo-meme.deb 39 | ``` 40 | 41 | Execute same command agaiin to update. 42 | 43 | ### macOS 44 | 45 | ``` 46 | $ brew tap greymd/tools 47 | $ brew install echo-meme 48 | ``` 49 | 50 | ### Manual installation 51 | 52 | ``` 53 | $ wget https://git.io/echo-meme 54 | (or $ curl -OL https://git.io/echo-meme ) 55 | $ sudo install -m 755 /usr/bin/echo-meme 56 | ``` 57 | 58 | ## Usage 59 | 60 | ``` 61 | $ echo-meme --help 62 | Usage: 63 | echo-meme [OPTIONS] MESSAGE 64 | 65 | OPTIONS: 66 | --help Display this help and exit 67 | --version Output version information and exit 68 | -s Read message from stdin 69 | -r Send request to register new meme (see REGISTER MEME) 70 | 71 | REGISTER MEME: 72 | '{}' is the placeholder of the message. 73 | For example, 74 | $ echo-meme -r 'こんにちは{}、ありがとう{}' 75 | It displays the URL to send the pull-request to the echo-meme repository. 76 | https://github.com/greymd/echo-meme/issues/new... 77 | ``` 78 | -------------------------------------------------------------------------------- /bin/echo-meme: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -u 3 | 4 | readonly EM_VERSION="v1.1.1" 5 | readonly EM_THIS_CMD="${0##*/}" 6 | readonly EM_PLACEHOLDER='{}' 7 | readonly EM_TEMPLATES=( 8 | # "はい今死んだ!今君の{}死んだよ!" 9 | # "{}が死んでも代わりはいるもの" 10 | # "諸君らが愛してくれた{}は死んだ。なぜだ!?" 11 | "40秒で{}しな!" 12 | "そのとき{}が動いた!" 13 | "{}っていうレベルじゃねぇぞ!" 14 | "急に{}が来たので" 15 | "為替と{}の値動きです" 16 | "やつはとんでもないものを盗んでいきました。あなたの{}です" 17 | "それにしてもこの{}、ノリノリである" 18 | "高度に発達した{}は魔法と区別がつかない" 19 | "ヒャッハー!!{}は消毒だー!!!" 20 | "ざんねんながら{}はきえてしまいました" 21 | "無駄に洗練された無駄の無い無駄な{}" 22 | "むしゃくしゃしていた。{}なら何でもよかった。" 23 | "この{}はフィクションであり、実在する、人物・地名・団体とは一切関係ありません。" 24 | "我思う、ゆえに{}あり" 25 | "わぁい{}、あかり{}大好き" 26 | "{}は人を傷つける。いつだって" 27 | "{}をセンターに入れてスイッチ..." 28 | "パンがなければ{}を食べればいいのよ" 29 | "吾輩は{}である。名前はまだ無い。" 30 | "守りたい、この{}" 31 | "身体は闘争を求める → {}が売れる → {}の新作が作られる" 32 | "{}かわいいよ{}" 33 | "「きたねぇ{}だ」" 34 | "素晴らしい!ホラ、見て御覧なさい!こんなに綺麗な{}ですよ!" 35 | "ついカッとなってやった、今は{}している。" 36 | "だが{}は四天王の中で最弱" 37 | "いいですか、家に帰るまでが{}です" 38 | "ご注文は{}ですか" 39 | "突然の{} " 40 | "三十六計{}に如かず" 41 | "我が生涯に一片の{}なし!" 42 | "{}は小説よりも奇なり" 43 | "お風呂にする?シャワーにする?それとも{}?" 44 | "見ろ!人が{}のようだ!" 45 | "{}は爆発だ" 46 | "{}に代わってお仕置きよ。" 47 | "お前それ{}でも同じ事言えんの?" 48 | "お前それ{}の前でも同じこと言えんの?" 49 | "飛ばない{}はただの{}だ" 50 | "あきらめたらそこで{}終了だよ" 51 | "{}は俺を怒らせた" 52 | "人民の、人民による、人民のための{}" 53 | "古池や{}飛びこむ水の音" 54 | "{}は素人なのですが質問よろしいでしょうか" 55 | "汚いなさすが{}きたない" 56 | "この{}を作ったのは誰だあっ!!" 57 | "{}に気づくとは…やはり天才か" 58 | "{}……そういうのもあるのか" 59 | "春はあけぼの。夏は夜。秋は夕暮れ。冬は{}" 60 | "この後、衝撃の{}が!!" 61 | "人生、宇宙、すべての答え = {}" 62 | "そんな{}で大丈夫か?" 63 | "{}はいつもひとつ" 64 | "あぁ^~{}がぴょんぴょんするんじゃぁ^~" 65 | "さては{}だなオメー" 66 | "{}細胞はありまぁす" 67 | "(ペロッ) … !? こ、これは…{}!!!" 68 | "がんばれ{}…おまえがナンバー1だ!!" 69 | "まるで{}のバーゲンセールだな…" 70 | "お前のモノは{}のモノ、{}のモノも{}のモノ" 71 | "30億のデバイスで走る{}" 72 | "病は{}から" 73 | "{}も休み休み言え" 74 | "YES{}NOタッチ" 75 | "でも大丈夫。そう、{}ならね" 76 | "確実!そう{}を飲んだらゲップが出るっていうくらい確実じゃッ!" 77 | "{}がッ泣くまで殴るのをやめないッ!" 78 | "意外!それは{}ッ!" 79 | "こいつはくせえッー!{}以下のにおいがプンプンするぜッーーーーッ!!" 80 | "ち、ちがうこれはただの{}じゃ……" 81 | "新{}の神となる" 82 | "仮に変態だとしても変態という名の{}だよ!" 83 | "この謎はもう、我が輩の{}の上だ" 84 | "私コンクリートでもバターと{}で炒めたら食べられると思う" 85 | "「{}どうですか」「{}駄目です」" 86 | "{}を食べる時はね、誰にも邪魔されず自由でなんというか救われてなきゃあダメなんだ。独りで静かで豊かで・・・" 87 | "えっ今日は全員{}食っていいのか!!" 88 | "ふたりは幸せな{}をして終了" 89 | "「{}を信じてみるだけでいい。きっと、生きる道が見えてくる。」──── ゲーテ" 90 | "つまづいたっていいじゃないか {}だもの みつを" 91 | "{}は めのまえが まっくらに なった!" 92 | "俺の{}か?欲しけりゃくれてやる 探せ!{}の全てをそこにおいてきた!" 93 | "たぶん動くと思うから{}しようぜ!" 94 | "{}を覗く時{}もまたあなたを覗いているのだ" 95 | "よろしい ならば{}だ" 96 | "我がドイツの{}は世界一ィィィ!" 97 | "いいかい学生さん、{}をな、{}をいつでも食えるくらいになりなよ。" 98 | "俺らこんな{}いやだ 俺らこんな{}いやだ 東京へ出るだ" 99 | "ハァ テレビも無ェ、{}も無ェ、生まれてこのかた見だごとア無ェ" 100 | "一万年と二千年前から{}してる" 101 | "あんなのは{}です!偉い人にはそれがわからんのですよ!" 102 | "認めたくないものだな…{}故の過ちというものを" 103 | "悲しいけど、これ、{}なのよね。" 104 | "あえて言おう、{}であると!" 105 | "{}とは違うのだよ、{}とは!" 106 | "貴様だって、{}だろうに!" 107 | "MAKE {} GREAT AGAIN!" 108 | "ともあれ、{}は滅ぶべきであると考える次第である" 109 | "俺、{}(`ェ´)ピャー" 110 | "{}とはいったい・・・うごごご!" 111 | "{}は別に強さをアッピルなどしてはいない" 112 | "{}の顔を三度までという名セリフを知らないのかよ" 113 | "{}を強いと感じてしまってるやつは本能的に長寿タイプ" 114 | "本当につよいやつは強さを口で説明したりはしないからな口で説明するくらいなら{}は牙をむくだろうな{}パンチングマシンで100とか普通に出すし" 115 | "「もうついたのか!」「はやい!」「きた!{}きた!」「メイン{}きた!」「これで勝つる!」" 116 | "このままでは{}の寿命がストレスでマッハなんだが・・" 117 | "{}の怒りが有頂天になった この怒りはしばらくおさまる事を知らない" 118 | "後輩をかばいすべての責任を負った{}に対し、車の主、暴力団員谷岡に言い渡された示談の条件とは・・・。" 119 | "疲れからか、不幸にも黒塗りの{}に追突してしまう。" 120 | "そこのお前!{}一個に含まれるビタミンCは{}一個分だぜ" 121 | "この殺伐としたスレに{}が!!" 122 | "久遠に伏したるもの{}する事なく怪異なる永劫の内には{}すら終焉を迎えん" 123 | "*「ふしぎな ひかりが あたりに みちる。」*「バリアごしに うすあかりが みえる。」*「たびは ついに おわりを むかえる...」*「{}が みなぎった。」" 124 | "#1) 他人の{}を尊重すること。 #2) タイプする前に考えること。 #3) 大いなる{}には大いなる責任が伴うこと。" 125 | "カラダもってくれよ!!3倍{}拳だ!!" 126 | "{}が信じる俺でもない…俺が信じる{}でもない…{}が信じる…{}を信じろ…!" 127 | "お前に{}を救えるか" 128 | "すごーい!きみは{}ができるフレンズなんだね" 129 | "気分を害したことはごめんなさいね。でもね、それが、{}" 130 | "不要不急の{}" 131 | "おぼろげながら浮かんできたんです {}という数字が" 132 | "{}よかった。特にラストシーンで{}が親指を立てながら溶鉱炉に沈んでいくシーンは涙無しには見られなかった。" 133 | "なんで寺院に{}があんだよ 教えはどうなってんだ教えは!" 134 | "それは一般的には{}と言いま〜す" 135 | "" 136 | "おそろしく速い{} オレでなきゃ見逃しちゃうね" 137 | "@@@TEMPLATE_INSERT_HERE@@@" 138 | ) 139 | 140 | EM_command_version () { 141 | echo "${EM_THIS_CMD} ${EM_VERSION}" 142 | } 143 | 144 | EM_command_help () { 145 | cat << _EOS_ 146 | Usage: 147 | ${EM_THIS_CMD} [OPTIONS] MESSAGE 148 | 149 | OPTIONS: 150 | --help Display this help and exit 151 | --version Output version information and exit 152 | -s Read message from stdin 153 | -r Send request to register new meme (see REGISTER MEME) 154 | 155 | REGISTER MEME: 156 | '{}' is the placeholder of the message. 157 | For example, 158 | $ ${EM_THIS_CMD} -r 'こんにちは{}、ありがとう{}' 159 | It displays the URL to send a new issue to the ${EM_THIS_CMD} repository. 160 | https://github.com/greymd/echo-meme/issues/new... 161 | 162 | _EOS_ 163 | 164 | } 165 | 166 | EM_urlenc () { 167 | local _payload="$1" 168 | printf "%s" "$_payload" \ 169 | | od -v -An -tx1 \ 170 | | xargs \ 171 | | tr ' ' '%' \ 172 | | sed 's/^/%/' \ 173 | | tr '[:lower:]' '[:upper:]' 174 | } 175 | 176 | EM_command_register_global () { 177 | local _title="$1" ;shift 178 | local _body="$1" ;shift 179 | echo "https://github.com/greymd/echo-meme/issues/new?body=$(EM_urlenc "$_body")&title=$(EM_urlenc "$_title")" 180 | } 181 | 182 | EM_command_echo () { 183 | local _msg="$1" 184 | shift 185 | local _num_templates="${#EM_TEMPLATES[@]}" 186 | # - 1 to hide "@@@TEMPLATE_INSERT_HERE@@@" 187 | local _print_target_index="$(( RANDOM % ( _num_templates - 1 ) ))" 188 | # RANDOM range is 0 - 32767. take care. 189 | local _print_message="${EM_TEMPLATES[${_print_target_index}]}" 190 | printf "%s\\n" "${_print_message//$EM_PLACEHOLDER/${_msg}}" 191 | } 192 | 193 | EM_check_message_before_register() { 194 | local _msg="$1" 195 | if [[ -z "$_msg" ]]; then 196 | EM_msg_error "Empty message is not allowed" 197 | return 1 198 | fi 199 | ## Avoid to use =~ expression due to shellcheck SC2076 200 | if ! ( printf "%s" "$_msg" | grep "$EM_PLACEHOLDER") ; then 201 | EM_msg_error "Message does not include placeholder '$EM_PLACEHOLDER'" 202 | return 1 203 | fi 204 | for template in "${EM_TEMPLATES[@]}"; do 205 | if [[ "$template" == "$_msg" ]]; then 206 | EM_msg_error "Message '$_msg' has already registered." 207 | return 1 208 | fi 209 | done 210 | } 211 | 212 | EM_msg() { 213 | local _loglevel="$1" 214 | local _msgbody="$2" 215 | local _msg="${EM_THIS_CMD}:${_loglevel}: ${_msgbody}" 216 | printf "%s\\n" "${_msg}" >&2 217 | } 218 | 219 | EM_msg_info() { 220 | EM_msg "Info" "$1" 221 | } 222 | 223 | EM_msg_error() { 224 | EM_msg "Error" "$1" 225 | } 226 | 227 | EM_main () { 228 | local _opt_register_global=0 229 | local _opt_register_msg="" 230 | local _msg=() 231 | while (( $# > 0 )); do 232 | local _opt="$1"; shift 233 | case "$_opt" in 234 | --help) 235 | EM_command_help 236 | return 0 237 | ;; 238 | --version) 239 | EM_command_version 240 | return 0 241 | ;; 242 | -s) 243 | IFS=$'\n' read -r -a _msg -d '' <<<"$(cat)" 244 | ;; 245 | -r) 246 | _opt_register_global=1 247 | _opt_register_msg="${1-}" 248 | ;; 249 | *) 250 | [[ -n "$_opt" ]] && _msg+=("$_opt") 251 | ;; 252 | esac 253 | done 254 | if [[ $_opt_register_global -eq 1 ]]; then 255 | EM_check_message_before_register "${_opt_register_msg}" || { 256 | EM_command_help 257 | return 1 258 | } 259 | EM_msg_info "Open this URL and just click [Submit this issue]! Do not hesitate." 260 | EM_command_register_global "new_meme_request:${_opt_register_msg:0:10}..." "template:[${_opt_register_msg}]" 261 | return 0 262 | fi 263 | # EM_msg_info "${#_msg[@]}" 264 | if [[ "${#_msg[@]}" -eq 0 ]]; then 265 | _msg=("$USER") 266 | fi 267 | EM_command_echo "${_msg[*]}" 268 | } 269 | 270 | EM_main ${1+"$@"} 271 | exit $? 272 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -ue 3 | 4 | readonly THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-${(%):-%N}}")" && pwd)" 5 | readonly BINMODE=755 6 | readonly DOCMODE=644 7 | readonly PREFIX="${1:-/usr/local}" 8 | readonly PREFIX_BIN="${PREFIX}/bin" 9 | readonly PREFIX_MAN="${PREFIX}/share/man/man1" 10 | 11 | # Install (bin) 12 | echo install -d "${PREFIX_BIN}" 13 | install -d "${PREFIX_BIN}" 14 | echo install -m "${BINMODE}" "${THIS_DIR}/bin/echo-meme" "${PREFIX_BIN}/echo-meme" 15 | install -m "${BINMODE}" "${THIS_DIR}/bin/echo-meme" "${PREFIX_BIN}/echo-meme" 16 | 17 | # Install (man) 18 | echo install -d "${PREFIX_MAN}" 19 | install -d "${PREFIX_MAN}" 20 | echo install -m "${BINMODE}" "${THIS_DIR}/man/echo-meme.1" "${PREFIX_MAN}/echo-meme.1" 21 | install -m "${BINMODE}" "${THIS_DIR}/man/echo-meme.1" "${PREFIX_MAN}/echo-meme.1" 22 | -------------------------------------------------------------------------------- /man/echo-meme.1: -------------------------------------------------------------------------------- 1 | .TH ECHO\-MEME 1 "MAR 2019" "User Commands" "" 2 | .SH NAME 3 | .PP 4 | echo\-meme \- Print your message as a part of various Japanese internet memes. 5 | .SH SYNOPSIS 6 | .PP 7 | echo\-meme [\fB\fCOPTIONS\fR] \fIMESSAGE\fP ... 8 | .SH OPTIONS 9 | .TP 10 | \fB\fC\-\-help\fR 11 | Display this help and exit 12 | .TP 13 | \fB\fC\-\-version\fR 14 | Output version information and exit 15 | .TP 16 | \fB\fC\-s\fR 17 | Read message from stdin 18 | .TP 19 | \fB\fC\-r\fR 20 | Send request to register new meme (see REGISTER MEME) 21 | .SH REGISTER MEME 22 | .PP 23 | \fB\fC{}\fR is the placeholder of the message. 24 | .TP 25 | For example, 26 | $ \fB\fCecho\-meme\fR \-r 'all your {} are belong to us' 27 | .PP 28 | It displays the URL to send a new issue to the echo\-meme repository. 29 | .SH BUGS 30 | .PP 31 | Report bug from \[la]https://github.com/greymd/echo-meme/issues/new\[ra] . 32 | .SH AUTHOR AND COPYRIGHT 33 | .PP 34 | Copyright (c) 2019 Yamada, Yasuhiro \[la]yamada@gr3.ie\[ra] Released under the MIT License. 35 | \[la]https://github.com/greymd/echo-meme\[ra] 36 | -------------------------------------------------------------------------------- /man/man.md: -------------------------------------------------------------------------------- 1 | ECHO-MEME 1 "MAR 2019" "User Commands" "" 2 | ======================================= 3 | 4 | 5 | NAME 6 | ---- 7 | 8 | echo-meme - Print your message as a part of various Japanese internet memes. 9 | 10 | SYNOPSIS 11 | -------- 12 | 13 | echo-meme [`OPTIONS`] *MESSAGE* ... 14 | 15 | OPTIONS 16 | ------- 17 | 18 | `--help` 19 | Display this help and exit 20 | 21 | `--version` 22 | Output version information and exit 23 | 24 | `-s` 25 | Read message from stdin 26 | 27 | `-r` 28 | Send request to register new meme (see REGISTER MEME) 29 | 30 | REGISTER MEME 31 | ------ 32 | 33 | `{}` is the placeholder of the message. 34 | 35 | For example, 36 | $ `echo-meme` -r 'all your {} are belong to us' 37 | 38 | It displays the URL to send a new issue to the echo-meme repository. 39 | 40 | BUGS 41 | ------ 42 | 43 | Report bug from https://github.com/greymd/echo-meme/issues/new . 44 | 45 | AUTHOR AND COPYRIGHT 46 | ------ 47 | 48 | Copyright (c) 2019 Yamada, Yasuhiro Released under the MIT License. 49 | https://github.com/greymd/echo-meme 50 | -------------------------------------------------------------------------------- /pkg/echo-meme.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greymd/echo-meme/b9395d1705ed2a10a1da8fc423cc26260474f0c8/pkg/echo-meme.deb -------------------------------------------------------------------------------- /pkg/echo-meme.rpm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greymd/echo-meme/b9395d1705ed2a10a1da8fc423cc26260474f0c8/pkg/echo-meme.rpm -------------------------------------------------------------------------------- /script/crontab: -------------------------------------------------------------------------------- 1 | 0 12 * * * cd /path/to/repo/echo-meme/script/ && GITHUB_AUTH=*** bash ./import_issue_batch.sh > ./import_issue_batch.log 2>&1 2 | -------------------------------------------------------------------------------- /script/genpkg.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -ue 3 | trap 'rm -f $REPO_DIR/echo-meme.tar.gz' EXIT 4 | readonly REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-${(%):-%N}}")" && cd ../ && pwd)" 5 | tar zcvf "${REPO_DIR}"/echo-meme.tar.gz -C "${REPO_DIR}" bin man .tar2package.yml 6 | docker run -i greymd/tar2rpm:1.0.1 < "${REPO_DIR}"/echo-meme.tar.gz > "${REPO_DIR}/pkg/echo-meme.rpm" 7 | docker run -i greymd/tar2deb:1.0.1 < "${REPO_DIR}"/echo-meme.tar.gz > "${REPO_DIR}/pkg/echo-meme.deb" 8 | -------------------------------------------------------------------------------- /script/import_issue_batch.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # =================================== 4 | # Required Environment: 5 | # * Set SSH key to access GitHub under ~/.ssh/ 6 | # * Set GITHUB_AUTH -- Auth token for GitHub Rest API. 7 | # * GNU sed, jq, curl, git 8 | # =================================== 9 | set -xue 10 | 11 | export GITHUB_AUTH="${GITHUB_AUTH}" 12 | readonly COMMON_HEADER=("--retry" "5" "-H" "User-Agent: Travis/1.0" "-H" "Authorization: token $GITHUB_AUTH" "-H" "Accept: application/vnd.github.v3+json" "-L" "-f") 13 | readonly REPO="greymd/echo-meme" 14 | readonly GIT_REPODIR="${TMPDIR:-/tmp}/${REPO}" 15 | readonly GIT_BRANCH="master" 16 | trap 'rm -rf "${GIT_REPODIR}"' EXIT 17 | 18 | get_issue_list () { 19 | local _repo="$1" 20 | local _api_url="https://api.github.com/repos/${_repo}/issues" 21 | curl "${COMMON_HEADER[@]}" "${_api_url}" 22 | } 23 | 24 | get_issue () { 25 | local _repo="$1" ;shift 26 | local _number="$1" 27 | local _api_url="https://api.github.com/repos/${_repo}/issues/${_number}" 28 | curl "${COMMON_HEADER[@]}" "${_api_url}" 29 | } 30 | 31 | create_comment () { 32 | local _repo="$1" ;shift 33 | local _issue_num="$1" ;shift 34 | local _comment="$1" ;shift 35 | local _api_url="https://api.github.com/repos/${_repo}/issues/${_issue_num}/comments" 36 | curl "${COMMON_HEADER[@]}" \ 37 | -X POST \ 38 | -d '{ 39 | "body": "'"${_comment}"'" 40 | }' \ 41 | "${_api_url}" 42 | } 43 | 44 | git_update () { 45 | local _repo="$1" ;shift 46 | local _msg="$1" ;shift 47 | local _issue_num="$1" 48 | local _repodir="${GIT_REPODIR}" 49 | mkdir -p "${_repodir}" 50 | git clone -b "$GIT_BRANCH" \ 51 | "git@github.com:${_repo}.git" \ 52 | "${_repodir}" || true 53 | cd "${_repodir}" 54 | update_meme "${_repodir}" "$_msg" 55 | git add "${_repodir}/bin/echo-meme" 56 | git commit -m "Import new meme (Fix #${_issue_num})" 57 | git push origin "$GIT_BRANCH" 58 | } 59 | 60 | update_meme () { 61 | local _repodir="$1" ;shift 62 | local _msg="$1" 63 | printf '/^[^#]*"@@@TEMPLATE_INSERT_HERE@@@"/i \ \ "%s"' "$_msg" \ 64 | | sed -f - -i "${_repodir}"/bin/echo-meme # GNU sed required 65 | } 66 | 67 | regulate_body () { 68 | grep -oE 'template:\[.+\]' | sed -r 's/^template:\[(.+)\]$/\1/' | sed 's/"/\\"/' 69 | } 70 | 71 | main () { 72 | local _new_meme 73 | while read -r n; do 74 | _new_meme="$(get_issue "${REPO}" "$n" | jq -r '.body' | regulate_body)" 75 | ( git_update "${REPO}" "$_new_meme" "$n" ) 76 | create_comment "${REPO}" "$n" "THIS COMMENT IS POSTED BY BOT -- [$_new_meme] is imported. You rocked it!" 77 | done < <(get_issue_list "${REPO}" | jq -r '.[].number') 78 | return 0 79 | } 80 | 81 | main ${1+"$@"} 82 | exit $? 83 | -------------------------------------------------------------------------------- /test/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -n "$BASH_VERSION" ]; then 4 | echo "Testing for bash $BASH_VERSION" 5 | fi 6 | 7 | # Directory name of this file 8 | readonly THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-${(%):-%N}}")" && pwd)" 9 | 10 | oneTimeSetUp(){ 11 | BIN_DIR="${THIS_DIR}/../bin/" 12 | BIN_NAME="echo-meme" 13 | EXEC="${BIN_DIR}${BIN_NAME}" 14 | } 15 | 16 | setUp(){ 17 | echo ">>>>>>>>>>" >&2 18 | } 19 | 20 | tearDown(){ 21 | echo "<<<<<<<<<<" >&2 22 | echo >&2 23 | } 24 | 25 | test_empty_message() { 26 | ${EXEC} -r > /dev/null 27 | actual=$? 28 | expected=1 29 | assertEquals "$expected" "$actual" 30 | 31 | seq 3 | ${EXEC} -r -s > /dev/null 32 | actual=$? 33 | expected=1 34 | assertEquals "$expected" "$actual" 35 | } 36 | 37 | test_invalid_registration() { 38 | ${EXEC} -r 'あいうえお' > /dev/null 39 | actual=$? 40 | expected=1 41 | assertEquals "$expected" "$actual" 42 | 43 | } 44 | 45 | test_valid_registration() { 46 | ${EXEC} -r 'あいうえお{}かきくけこ' 47 | actual=$? 48 | expected=0 49 | assertEquals "$expected" "$actual" 50 | } 51 | 52 | test_version() { 53 | pattern="^echo-meme v[0-9]+.[0-9]+.[0-9]+$" 54 | [[ "$(${EXEC} --version)" =~ $pattern ]] 55 | actual=$? 56 | expected=0 57 | assertEquals "$expected" "$actual" 58 | } 59 | 60 | test_help() { 61 | ${EXEC} --help > /dev/null 62 | actual=$? 63 | expected=0 64 | assertEquals "$expected" "$actual" 65 | } 66 | 67 | test_stdin() { 68 | pattern="^.*1 2 3.*$" 69 | [[ "$(seq 3 | ${EXEC} -s)" =~ $pattern ]] 70 | actual=$? 71 | expected=0 72 | assertEquals "$expected" "$actual" 73 | 74 | pattern="^.*あいうえお.*$" 75 | [[ "$(echo あいうえお | ${EXEC} -s)" =~ $pattern ]] 76 | actual=$? 77 | expected=0 78 | assertEquals "$expected" "$actual" 79 | } 80 | 81 | test_normal() { 82 | pattern="^.*あいうえお.*$" 83 | [[ "$(${EXEC} あいうえお)" =~ $pattern ]] 84 | actual=$? 85 | expected=0 86 | assertEquals "$expected" "$actual" 87 | } 88 | 89 | # shellcheck source=/dev/null 90 | . "${THIS_DIR}/shunit2/shunit2" 91 | --------------------------------------------------------------------------------