LoginSignup
2
2

P2P地震情報のWebSocketを使って地震情報BOTをつくろう!

Last updated at Posted at 2022-05-10

見にくい記事に気を付けてください(?)

おしらせ

更新版、出来ました。

はじめに

(Discord.jsとか使ってリアルタイムで情報更新するやつ作りたいなぁ)
(せや!WebSocketのやつとかあるか探してみよ!)
(あった!!これでやってみよう!)

と、こんな感じで作り始めました。

どういうやつ?

地震情報を送ったり~
image.png
震源情報を送ったり~
image.png
緊急地震速報をお知らせするのもあるぞ!
image.png

前置き : 開発環境

Node.js v16.10.0
npm 7.2.4
Windows 11 Pro
git 2.32.0.windows.2

コード

// Note: Discord.js のclient関連はスキップしてます

const { WebSocket } = require('ws')
const ws = new WebSocket('wss://api.p2pquake.net/v2/ws')
const ChangeToView = require('./lib/lib.js')
const c = new ChangeToView()

ws.onmessage = async (data) => {

  const o = JSON.parse(data.data)  
 console.log("Response P2P WebSocketServer. Code :"+o.code)

    if(o.code === 551){

    let msindo = c.shindo(o.earthquake.maxScale)
    let atime = o.earthquake.time
    let domesticTsunami = o.earthquake.domesticTsunami
    let depth = o.earthquake.hypocenter.depth
    let magunitude = o.earthquake.hypocenter.magnitude
    let hyposentername = o.earthquake.hypocenter.name
    let pointskazu = o.points.length
    let eq = ""
    let info = ""
    let tsunamiwarning = ""

    if(depth === -1) return depth = "[不明]"
    if(magunitude === -1) return magunitude = "[不明]"
    if(hyposentername === undefined) return hyposentername = "[不明]"

    if(domesticTsunami === "Warning") tsunamiwarning = "現在、津波警報が発表されています。"
    else tsunamiwarning = "この地震による津波の心配はありません。"

    let maxscaleplace=""
      for(i of o.points){
        if(i.scale === o.earthquake.maxScale){
          maxscaleplace += "**"+i.addr+"**\n"
        }
      }

      let title = `EarthQuakeInfo - 最大震度${msindo}`
      let placedescription = `最大震度${msindo}を\n${maxscaleplace}で観測しています。`
      if(o.earthquake.maxScale === -1 && maxscaleplace===""){
        title = `EarthQuakeInfo - 震源情報`
        placedescription = ""
      }
      
      console.log(pointskazu) 
      const embed = new MessageEmbed().setTitle(title).setDescription(`〈震源と大きさ〉\n${hyposentername} M${magunitude} 最大震度${msindo}\n・震源の深さ : ${depth}km\n・発生時刻 : ${atime}\n\n${placedescription}\n**${tsunamiwarning}**`).setFooter(`id : ${o._id}`).setColor('YELLOW')
    	client.channels.cache.get('951418875847786496').send({embeds:[embed]}).catch(e => {})
    }

  if(o.code === 554){
  const embed = new MessageEmbed().setTitle('緊急地震速報 - (警報)').setDescription(`緊急地震速報です。強い揺れに警戒して下さい。\n緊急地震速報が発令された地域では、震度5弱以上の揺れが来るかもしれません。\n落ち着いて、身の安全を図ってください。`).setFooter(`id : ${o._id}`).setColor('RED')
    client.channels.cache.get('951418875847786496').send({embeds:[embed]}).catch(e => {})
  }
}

震度とか津波の情報を日本語に変換してくれるふれんず (lib.js)

class ChangeToView {
    tsunami(warning){
        switch(warning){
            case "Warning":
              return warning = "警報が発表されている地域があります"
            break;
            case "Unknown":
              return warning = "不明"
            break;
            case "None":
              return warning = "なし"
            break;
            case "Checking":
              return warning = "調査中"
            break;  
            case "NonEffective":
              return warning = "若干の海面変動"     
            break; 
            default:
              return warning = "情報のフォーマットに失敗。"
            break;
          }
    }
    shindo(sindo){
        switch(sindo){
            case 10:
            return sindo = "1"
            break;
            case 20:
            return sindo = "2"
            break;
            case 30:
            return sindo = "3"
            break;
            case 40:
            return sindo = "4"
            break;
            case 45:
            return sindo = "5弱"
            break;
            case 50 :
            return sindo = "5強"
            break;
            case 55 :
            return sindo = "6弱"
            break;
            case 60:
            return sindo = "6強"
            break;
            case 70:
            return sindo = "7"
            break;
            case -1:
            return sindo = "[不明]"
            break;
          }
    }
    icon(sindo){
      switch(sindo){
      case '5弱':
        return sindo = '5m'
      break;

      case '5強':
        return sindo = '5p'
      break;

      case '6弱':
        return sindo = '6m'
      break;

      case '6強':
        return sindo = '6p'
      break;

      default:
         return sindo = sindo
      break;
    }
  }
  depth(depth){
    switch(depth){
      case '0':
       return depth = "ごく浅い"

       default:
         return depth = depth
    }
  }
}

module.exports = ChangeToView;

反省

・わざわざ変換する部分をClass化する必要がない
・コードが汚い
・コードが汚い
・コードが汚い
・コードが汚い
・コードが汚い

最後に

・このコード動かねえじゃん!とか思ったらすぐにお伝えください。直します。
・P2P地震情報のたくやさん、愛してます。

勝手に記事にして勝手に名前上げてしまって本当にすいません(´・ω・`)

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2