DiscordBot作ってみた

Discordを使い始めて3週間ぐらい

Discordでチーム分けするBotを作ってみる.

というのも,Discordでもくもく会を開いてみるか~という流れで.チーム分けしたくて.

参考サイト様

qrunch.net

discordpy.readthedocs.io

このあたりを見ながら

完成したコード

これで

/zawazawa [定員]

で定員ごとのチーム分けができます.VCに入ってるかつオンラインのユーザーをシャッフルしてチーム分け.

余剰が出る場合は,更に各部屋に1人ずつ振り分けます.

定員から部屋数を計算する際に,定義した部屋数より多くなれば,定員を増やして対処.

WordPressでJavascriptのstyle.marginTopが動かない

1行のために数時間使った

まずは該当コード

<?php // YouTube埋め込み ?>
<?php if (!empty($data_list['youtube'][0])) {
  // URLから動画IDのみ抽出
  $videoId = ltrim($data_list['youtube'][0], 'https://youtu.be/'); ?>

  <?php // 幅取得用 ?>
  <div id='get-width'></div>

  <?php // 提供元 ?>
  <div id='presented-by'>
    <a href="https://www.hogehoge.com/" data-lightbox="group"><img src="hogehoge.png"></a>
  </div>

  <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
  <div id='youtube'></div>

  <script>
  //*** 動画のアスペクト比 ***//
  var aspectWidth = 16,
  aspectHeight = 9;


  jQuery(function ($) {
    $('#presented-by').hide();
  });

  // 動画の横幅は100%で比率に合わせて表示
  var youtubeWidth = document.getElementById('get-width').clientWidth,
  youtubeHeight = (youtubeWidth/aspectWidth) * aspectHeight;

  // 提供元の表示位置を中央に調整
  var presentedBy = document.getElementById('presented-by');
  presentedBy.style.marginTop = youtubeHeight/2 - presentedBy.clientHeight/2;


  // 2. This code loads the IFrame Player API code asynchronously.
  var tag = document.createElement('script');

  tag.src = "https://www.youtube.com/iframe_api";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

  // 3. This function creates an <iframe> (and YouTube player)
  //    after the API code downloads.
  var player;
  var videoId = <?php echo json_encode($videoId); ?>;
  function onYouTubeIframeAPIReady() {
    player = new YT.Player('youtube', {
      width: youtubeWidth,
      height: youtubeHeight,
      videoId: videoId,
      events: {
        'onReady': onPlayerReady,
        'onStateChange': onPlayerStateChange
      }
    });
  }

  // 4. The API will call this function when the video player is ready.
  function onPlayerReady(event) {
    event.target.playVideo();
  }

  // 5. The API calls this function when the player's state changes.
  //    The function indicates that when playing a video (state=1),
  //    the player should play for six seconds and then stop.
  var done = false;
  function onPlayerStateChange(event) {
    // 動画終了後と一時停止中に画像を表示
    var status = player.getPlayerState();
    if (status == 0 || status == 2) {
      jQuery(function ($) {
        $('#presented-by').fadeIn(1000);
      });
    } else {
      jQuery(function ($) {
        $('#presented-by').fadeOut(1000);
      });
    }
  }
  </script>
<?php } ?>

の中の

presentedBy.style.marginTop = youtubeHeight/2 - presentedBy.clientHeight/2;

この1行.

これがどーしても動かない.

いや,動かないだけならデバッグしろよって話なんですが

謎1

WordPressで設計しているのですが,デバッグtrueにすると動く.falseでは動かない.

謎2

console.log(presentedBy.style.marginTop);

とかしてみると,デバッグをONにすると動くということで,もちろん値が返ってくる. しかし,OFFにすると,値が空('')で返ってくる.

予想と結果

デバッグモード入れたら動く&値が取れてないっぽいということは,何かしらの読み込み順の問題?

→ BJ Lazy Loadという読み込み遅延系のプラグインを入れてたこともあり,とりあえず全てのプラグインを無効化

結果:無駄


WordPress全体のデバッグは外して,Javascriptのみデバッグを入れてみる(使ったことないから合ってるかは知らない)

→ define('SCRIPT_DEBUG', true);を追記

結果:無駄

さらにログを見る

もちろん,なんのエラーも出ていない.空が取得されているので,要素も定義済み.

var presentedBy = document.getElementById('presented-by');
presentedBy.style.marginTop = youtubeHeight/2 - presentedBy.clientHeight/2;
console.log(presentedBy.style.marginTop);

style = presentedBy.getAttribute('style');
console.log(style);

cssText = presentedBy.style.cssText;
console.log(cssText);

こんなのを書いてみる.

デバッグONの場合

f:id:a2h1r0:20200420103931p:plain

デバッグOFFの場合

f:id:a2h1r0:20200420104057p:plain

という感じ.

ここでわかること

どんな書き方でも,#presented-by要素のstyleが空になってる.

解決策

var presentedBy = document.getElementById('presented-by');
presentedBy.setAttribute('style', 'margin-top: 100px;');
console.log(presentedBy.style.marginTop);

これで動く.

もうちょっと見てみる

var presentedBy = document.getElementById('presented-by');
presentedBy.style.marginTop = youtubeHeight/2 - presentedBy.clientHeight/2;
console.log(presentedBy.style.marginTop);

cssText = presentedBy.style.cssText;
console.log(cssText);

presentedBy.setAttribute('style', 'margin-top: 100px;');
console.log(presentedBy.style.marginTop);

style = presentedBy.getAttribute('style');
console.log(style);

f:id:a2h1r0:20200420104952p:plain

つまり

.styleを使った要素の変更,追加がうまくいかない. .styleを使わずに.setAttributeを使うことで回避できた感じ. よく見ると,.getAttributeの方もnullで他と違うね.

参考サイト様

qiita.com

.gitignoreの設定

$ git add . がうまくいかない

なんか,

$ git add .
The following paths are ignored by one of your .gitignore files:
wp-config.php
Use -f if you really want to add them.
fatal: no files added

と言われる.え?.gitignoreあるけど無視してくれないの?

$ git add -A .

これで良かった.-Aオプションで"すべての追跡対象のファイルについて,インデックスを更新"ということらしい.-A付けてなかったから追跡対象外のファイルあるけどどうするの?と言われていたらしい.

www-creators.com

FragmentでToastを表示する

Androidアプリはじめました

マジの忘備録ですが,Mainと同じでは動かなかったので.

これで動くっぽい.

Toast.makeText(getActivity(), "トーストのテストです。", Toast.LENGTH_SHORT).show();

参考サイト様

s-takumi.hatenablog.com

Slackからドキュメントルートを変更できるようにした

これはちょっと微妙

a2h1r0.hatenablog.com

これの応用.

$ mkdir ~/temp
$ sudo cp /etc/httpd/conf/httpd.conf ~/temp/httpd_bk.conf
$ sudo chmod 777 ~/temp/httpd_bk.conf

あと,visudoで

sudo mv /home/ユーザ名/temp/httpd.conf /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd

もパスワードなしに追加する必要あり.詳しくは上の記事を見て.

で,

これでabc!とかdef!とかで切り替えれるんやけど,なんかなあ.

最後まで実行されないとSlackに返答が来ないみたいで,途中でApacheが再起動されるので,読まれずに終了されて,返答が来ない. 動いてるんやけどね.

あと,これドキュメントルートが変わるので,変更したい全てのディレクトリにこのファイルを置かないと動かないのよね.うーん.

そもそもVirtualHostの設定がうまくいかなかったのが問題...

CentOSをリモートでシャットダウンしたい!

SlackからCentOSをシャットダウンする

まずはお勉強

www.agent-grow.com

qiita.com

このあたりを参考にゴニョってると,とりあえず文字の受け取りができた.

www.dahlbeck.net

あとはコマンドのお話.

Outgoing Webhookの設定

先述のサイト様を参考に,文字の受け取りを出来るようにする. 送信先のURLを自分のサーバの作ったPHPファイルに設定ね.

コマンドの設定

$ sudo shutdown +1

これを実行したい.が,sudoなので.

$ sudo visudo

で,下記を追記

root ALL=(ALL) ALL
apache ALL=(ALL) NOPASSWD: /sbin/shutdown -h +1

これでapacheはshutdownがsudoなしで使える.(だと思う)

PHPを書く

"Outgoing Webhookの設定"の時に作ったPHPを改造した.私はこんな感じに.

今回の私の例は,参考サイト様と違い,トリガーとなるキーワードで分岐をさせていない.

こんな感じになる.

f:id:a2h1r0:20200329143432p:plain

おもろい.

けどたぶん,セキュリティ的に怒られそう.ろくなデータ入ってないのでいいけど.

前の記事と合わせると...

a2h1r0.hatenablog.com

f:id:a2h1r0:20200329121906p:plain

Wolで電源入れる

通知

シャットダウンし忘れ防止で朝9時に通知

キーワード送信でシャットダウン

って感じ.おもろい.誰が使うねん.

CentOSで起動通知をSlackに

今回作ったやつ

f:id:a2h1r0:20200329121906p:plain

サーバが起動したらSlackに通知を入れたい

現在,自宅サーバに自分および友人のステージング環境を作っている.が,電気代が気になるので. 常時起動はさせず,使うときにWolで起動,って感じにしたい.

まずは調べよう.参考サイト様.

vdeep.net

www.mazn.net

dummywitty.hatenablog.com

www.yoheim.net

いちおうやったこと残す

環境によって違うかもなので.CentOS8.

Incoming WebHookの設定

先述の参考サイト様

シェルスクリプトでSlackに通知を送る方法 | vdeep

これそのまま設定してください.これだけで動きます!感動!

でもちょっとカスタム

パイプから渡された値でメッセージを分岐させる.(つまりコマンドも変更できるね)

私はこんな感じにしてみました.

で,私は"~/Command/notification-20200329.sh"て感じにしたので,

$ chmod 771 ~/Command/notification-20200329.sh

で権限を与えてから,

$ startup | ~/Command/notification-20200329.sh
$ uptime | ~/Command/notification-20200329.sh

とかで動きます.

これを起動時と,毎朝9時に実行したい

crontabを使います.

$ crontab -e

して,

@reboot sleep 10 && echo startup | /home/ユーザ名/Command/notification-20200329.sh
0 9 * * * echo uptime |  /home/ユーザ名/Command/notification-20200329.sh

こんな感じに設定してやる.

これで,起動10秒後に起動通知,毎朝9時に連続稼働通知が送られる.

ちなみに,

@reboot sleep 10 && <省略>

このsleepがないと,通知が送られない.なぜなら,起動してからネットワーク接続が確立するまでに時間を要するからだ.10秒でイイ感じ. あと,ログインしてないので,"~/"はダメ.フルパスで.

f:id:a2h1r0:20200329123029p:plain

おもろい.

つづき

a2h1r0.hatenablog.com