<commit_before>

'use strict'

const SakuyaBot = class {
  constructor (client, db, logger, rand) {
    this.client = client
    this.db = db
    this.logger = logger
    this.rand = rand

    // ツイートテキストを引数として、リアクションを返却する関数軍を
    // SakuyaBotに任意に組み込むことができる機能を提供する。
    // これを、リアクションプラグインと呼称し、
    // SakuyaBotの汎用的な口上を組み込む仕組みとして利用する。
    this.reaction_plugins = []
    
    this.teaSelector = require('./Teapot.js')
    
    // 起動時にアカウントの有効性を確認する
    this.client.verifyCredentials().then(
      (res) => {
        this.logger.info('Account verification succeed.')
        this.name = res.name
        this.screen_name = res.screen_name
        this.id = res.id_str
      }
    ).catch(
      () => {
        this.logger.fatal('Account verification failed.')
      }
    )
  }
  
  start () {
    this.logger.info('SakuyaBot started.')
    this.client.openUserStream({
      data: this.read.bind(this),
      event: this.receive.bind(this),
      error: (error) => {
        console.error(error)
        this.logger.error(error)
      }
    })
  }

  /**
   * リアクションプラグインを組み込む
   * @param func リアクションプラグイン
   */
  addReactionPlugin (plugin) {
    this.reaction_plugins.push(plugin)
  }

  // 毎日 0時に実行する
  daily_work (today) {
    // 秒単位のずれで日付が前後することを防ぐため 12時間分加算する
    today = new Date(today.getTime() + 43200)

    let m = today.getMonth() + 1
    let d = today.getDate()
    return this.db.sumDonation().then( (amount) => {
      return this.client.tweet(`${m}月 ${d}日になったわね。 先日は ${amount} ml の献血をいただきましたわ。`)      
    }).then(() => {
      return this.db.stashDonatedLog()
    }).catch((err) => {
      this.logger.error(err)
      this.logger.trace(err.trace)
    })<commit_msg>ミリ秒単位の間違いを修正<commit_after>

'use strict'

const SakuyaBot = class {
  constructor (client, db, logger, rand) {
    this.client = client
    this.db = db
    this.logger = logger
    this.rand = rand

    // ツイートテキストを引数として、リアクションを返却する関数軍を
    // SakuyaBotに任意に組み込むことができる機能を提供する。
    // これを、リアクションプラグインと呼称し、
    // SakuyaBotの汎用的な口上を組み込む仕組みとして利用する。
    this.reaction_plugins = []
    
    this.teaSelector = require('./Teapot.js')
    
    // 起動時にアカウントの有効性を確認する
    this.client.verifyCredentials().then(
      (res) => {
        this.logger.info('Account verification succeed.')
        this.name = res.name
        this.screen_name = res.screen_name
        this.id = res.id_str
      }
    ).catch(
      () => {
        this.logger.fatal('Account verification failed.')
      }
    )
  }
  
  start () {
    this.logger.info('SakuyaBot started.')
    this.client.openUserStream({
      data: this.read.bind(this),
      event: this.receive.bind(this),
      error: (error) => {
        console.error(error)
        this.logger.error(error)
      }
    })
  }

  /**
   * リアクションプラグインを組み込む
   * @param func リアクションプラグイン
   */
  addReactionPlugin (plugin) {
    this.reaction_plugins.push(plugin)
  }

  // 毎日 0時に実行する
  daily_work (today) {
    // 秒単位のずれで日付が前後することを防ぐため 12時間分加算する
    today = new Date(today.getTime() + 43200 * 1000)

    let m = today.getMonth() + 1
    let d = today.getDate()
    return this.db.sumDonation().then( (amount) => {
      return this.client.tweet(`${m}月 ${d}日になったわね。 先日は ${amount} ml の献血をいただきましたわ。`)      
    }).then(() => {
      return this.db.stashDonatedLog()
    }).catch((err) => {
      this.logger.error(err)
      this.logger.trace(err.trace)
    })
{'fraction_non_alphanumeric': 0.14171122994652408, 'fraction_numerical': 0.006535947712418301, 'mean_word_length': 2.330365974282888, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3257406', 'n_tokens_mistral': 1498, 'n_tokens_neox': 1437, 'n_words': 189}