hubotで定期的に名言を自分に送ってくれるロボットを作った

 

hubotで定期的に名言を自分に送ってくれるロボットを作った

環境

  • js
  • javascript
  • node.js
  • さくらvps
  • centOS7
  • hubot
  • slack
  • mariaDB
  • sql

説明

定期的に登録されている名言をランダムで自分に送ってくれるロボットをslack上に作りました。名言だけではなくて、何度読んでも役に立つブログとかも、この中に入れてます(<-どーでもよい)

機能

  • 「追加OO」とやると名言を追加できる
  • 「削除OO」とやると名言を削除できる
  • 「show me」とやると登録されている名言を全部見せてくれます
  • 「do it」とやると登録されている名言を定期的に喋りだします

技術的な説明

言語はnode.jsを使っています。node.jsは本当にクールだと思います。個人的に好きです。読みやすいし描きやすしサーバーの中でjavascript書けるし。データベースにはmariaDBをsqlで操作しています。OSはCentOS7です。定期的なクローン処理はforeverを使っています。細かくチュートリアルはしないので、ご了承ください。

うまくいってないところ

今現在、例えばスラック上で「追加 命もいらず、名もいらず、官位も金もいらぬ人は、始末に困るもの也」と打ち込んだとしましょう。**ちなみにこの言葉は西郷隆盛の言葉で僕が最も大好きな言葉です。こんな言葉は海外の偉人だって似たような言葉を聞いたことがありません。あれば誰か教えて欲しいです。(<-どーーでもいい)

上記のようにすれば名言は登録されるわけですが、「削除命もいらず、名もいらず、官位も金もいらぬ人は、始末に困るもの也」とやると削除するとこができません。ちゃんと「削除 命もいらず、名もいらず、官位も金もいらぬ人は、始末に困るもの也」とやらないとだめなんです。改行もちゃんとしなきゃいけないんです。

でも、下記の画像のように、show me で登録されている名言を見てみれば、改行など教えてくれませんから、どうにかしなきゃいけません。今後直していく予定です

スクリーンショット 2017-10-13 21.44.02.png

実装

何かの参考になれば幸いです。ソースが汚すぎるのと、全然無関係のコードもたくさん書いてあるので、全然参考になりません。今はちょっと忙しくて、ここら辺を整理する時間がありません。暇を見つけてアップデートしていきます。マーーー備忘録だし自分のブログだしいいっかあ。いやよくない!そんな性格やよくないんだ。もっと細かく細かく妥協しないようにしないとスズランのテッペン取れない。。。。

/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */

module.exports = function(robot) {

var fs = require('fs');
    jsonn = require('../hoge.json');


//ファイルの書き込み関数
function writeFile(path, data) {
  fs.writeFile(path, data, function (err) {
    if (err) {
        throw err;
    }   
  }); 
}




robot.respond(/who are you/i, msg => msg.send("I'm hubot!"));
robot.hear(/HELLO$/i, msg => msg.send("hello!"));
robot.respond(/who am I/i, msg => msg.send(`You are ${msg.message.user.name}`));
robot.respond(/what is this (.*)/i, msg => msg.send(`This is ${msg.match[1]}`));





//dbのデータを表示
robot.hear(/おはようございます/i, function(msg) {

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  password: "",
  database: ""
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM node_test_table", function (err, result, fields) {
    if (err) throw err;

    console.log(result);



    require('date-utils');
    var dt = new Date();
    var formatted = dt.toFormat("YYYY/MM/DD HH24時MI分SS秒");
    console.log(formatted);

    var myname = msg.message.user.name;

    return msg.send(`${formatted} ${myname} `);
  });
});

});




//お疲れ様でした
robot.hear(/お疲れ様でした$/i, function(msg) {

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  password: "",
  database: ""
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM node_test_table", function (err, result, fields) {
    if (err) throw err;

    console.log(result);



    require('date-utils');
    var dt = new Date();
    var formatted = dt.toFormat("YYYY/MM/DD HH24時MI分SS秒");
    console.log(formatted);

    return msg.send(`おつかれさまでした。 ${formatted} `);
  });
});

});























//dbのデータを表示
robot.hear(/show me$/i, function(msg) {

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  password: "",
  database: ""
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM node_test_table", function (err, result, fields) {
    if (err) throw err;

    console.log(result);
    length = Object.keys(result).length;



    require('date-utils');
    var dt = new Date();
    var formatted = dt.toFormat("YYYY/MM/DD HH24時MI分SS秒");
    console.log(formatted);


//     for (var i=1 ; i<=10 ; i++){
//   return msg.send(`${result[i].node_test_coulom} `);
// }


for(var i = 0; i < length;i++){
        (function(j){
            return msg.send(`${result[i].node_test_coulom} `);
            //console.log("Loading message %d".green, j);
            //htmlMessageboardString += MessageToHTMLString(BoardMessages[j]);
        })(i);
  }
  });
});

});










//dbのデータを表示
// robot.hear(/stop$/i, function(msg) {

// stopTimer();

// });




//発言開始
robot.hear(/do it$/i, function(msg) {

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  password: "",
  database: ""
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM node_test_table", function (err, result, fields) {
    if (err) throw err;

    console.log(result);
    require('date-utils');
    var dt = new Date();
    var formatted = dt.toFormat("YYYY/MM/DD HH24時MI分SS秒");
    console.log(formatted);



    setInterval(function() {
         //dbのデータの数を取得する
         length = Object.keys(result).length;


         //その数の範囲内で乱数を発生させる
         min = 0 ;
         max = length ;
         a = Math.floor( Math.random() * (max + 1 - min) ) + min ;
         return msg.send(`${result[a].node_test_coulom} `);
}, 100000);

  });
});
});





// var testTimer;

// function startTimer(){
// testTimer=setInterval(function(){


//      //dbのデータの数を取得する
//       length = Object.keys(result).length;


//      //その数の範囲内で乱数を発生させる
//       min = 0 ;
//          max = length ;
//          a = Math.floor( Math.random() * (max + 1 - min) ) + min ;

//     return msg.send(`${result[a].node_test_coulom} `);
//     //10秒?
// } , 100);
// }

// startTimer();









//dbのデータを削除
robot.hear(/削除/i, function(msg) {

a  = msg.message; 

//var sqll = "INSERT INTO node_test.node_test_table (node_test_coulom) VALUES('%hoge')".replace("%hoge", $hoge);


var mysql = require('mysql');

var con = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  password: "",
  database: ""
});

con.connect(function(err) {
  if (err) throw err;
  var $hoge = a;
  var sqll = "DELETE FROM node_test.node_test_table WHERE node_test_coulom = '%hoge'".replace("%hoge", $hoge);
  var sql = sqll.replace("削除", "");
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Number of records deleted: " + result.affectedRows);
  });
});

});














//dbに追加保存
 return robot.hear(/追加/i, function(msg) {
 const { text } = msg.message;

a  = msg.message; 
var data = {
    name: a,
};
writeFile('hoge.json', JSON.stringify(data));

var aaa = "aaa" 

    var mysql      = require('mysql');
    var connection = mysql.createConnection({

    host: process.env.DB_HOST || '127.0.0.1',
    user: process.env.DB_USER || 'root',
    password: process.env.DB_PASS || '',
    database: process.env.DB_NAME || ''

    });


    connection.connect();
    console.log('node楽しい♪');
    console.log(typeof t);

    var $hoge = a;


    var sqll = "INSERT INTO node_test.node_test_table (node_test_coulom) VALUES('%hoge')".replace("%hoge", $hoge);

    //sql文を作成する
    var sql =  sqll.replace("追加", "");

    //"INSERT INTO node_test.node_test_table (node_test_coulom) VALUES(text)";
    connection.query(sql, function (err, result) {
        if (err) throw err;
        console.log("1 record inserted");
      });

    connection.query('SET NAMES utf8', 'SELECT node_test_coulom FROM node_test_table;', function (error, results, fields) {
    console.log(results);
    })
    return msg.send(`${text} `);
   });
};
藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事