ホーム

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} `);
   });
};
Pocket
LinkedIn にシェア

エンジニアにおすすめできる本

Card image cap
リーダブルコード

より良いコードを書くためのシンプルで実践的なテクニック

Card image cap
Webを支える技術

HTTP,URI,HTML,そしてREST

Card image cap
誰でもPythonで作れる

儲かるAIとソフトウェアの作り方

Card image cap
プログラマが知るべき97のこと

現場で使える実践哲学のマスターピース

Card image cap
情熱プログラマー

時代を超えて。ソフトウェア開発者の幸せな生き方

Card image cap
アジャイルサムライ

プログラミング達人開発者への道

Card image cap
Rubyを作った男 まつもとゆきひろ

コードの世界 スーパー・プログラマになる14の思考法

ご提供 sponsor
 

Meee!(ミー)は、ビジネスからプライベート利用まで、個人のスキルを気軽に売り買いできるスキルマーケットです。カテゴリや居住地から、検索することが可能です。

 

ランゲージエクスチェンジは、ネイティブスピーカーと気軽にマッチングできる言語交換プラットフォームです。あなたの地元に住む外国人を探したり、留学や海外移住の前に、現地のネイティブスピーカーと繋がることもできます!

宣伝
 

りょすけトークchは、仕事や私生活をより豊にするYouTubeチャンネルです。文献(本、映画、論文)から役に立つ情報をまとめ、生涯にわたり役に立つ哲学をお届けしています。是非、チャンネル登録してみてね

-ホーム

Copyright© offブログ! , 2021 All Rights Reserved Powered by AFFINGER5.