Added "weather" command

This commit is contained in:
takumi091111
2017-09-27 23:55:00 +09:00
parent b8bc04b53c
commit efca2a20cd
2 changed files with 515 additions and 2 deletions

View File

@ -2,9 +2,100 @@ module Bot
module DiscordCommands
module WeatherCommands
extend Discordrb::Commands::CommandContainer
JPN_WEATHER_FORECAST = 'http://www.drk7.jp/weather/json/'
command(:weather) do |event|
nil
command(:weather, usage: 'weather <都道府県名> <地名>', description: '天気情報を表示', min_args: 1) do |event, pref_name, area_name|
list = JSON.load(open('weather.json'))
# リストから検索してIDを抽出
pref = list.find {|pref| pref["name"] == pref_name}
id = pref["id"]
# jsonpを取得
uri = URI.parse(JPN_WEATHER_FORECAST + "#{id}.js")
jsonp = Net::HTTP.get(uri)
# JSONP -> JSONに変換
json = JSON.load(jsonp.match(/\.callback\((.*)\)/)[1])
weather = nil
unless area_name.nil?
# エリアが指定されている時
unless json["pref"]["area"]["#{area_name}"].nil?
weather = json["pref"]["area"]["#{area_name}"]["info"][0]
else
event.respond 'エリアが見つかりません'
end
else
# エリアが指定されていない時
# weather.json(area)の最初の項目を指定 or なし
unless pref["area"][0].nil?
area_name = pref["area"][0]
weather = json["pref"]["area"]["#{area_name}"]["info"][0]
else
weather = json["pref"]["area"]["info"][0]
end
end
# 値の抽出
pref = json["pref"]["id"]
telop = weather["weather"]
maxtemp = weather["temperature"]["range"][0]["content"]
mintemp = weather["temperature"]["range"][1]["content"]
img = weather["img"]
fallchance = Array.new
# 降水確率を配列に追加
weather["rainfallchance"]["period"].each do |chance|
fallchance << chance["content"]
end
event.channel.send_embed do |embed|
embed.title = "#{pref}の天気情報"
embed.description = telop
# 埋め込みカラー
embed.color = case telop
when //
CONFIG[:weather][:snow]
when //
CONFIG[:weather][:rain]
when /晴れ/
CONFIG[:weather][:sunny]
when /くもり/
CONFIG[:weather][:cloudy]
else
CONFIG[:weather][:cloudy]
end
embed.thumbnail = Discordrb::Webhooks::EmbedThumbnail.new(
url: img
)
embed.add_field(
name: '最高気温',
value: maxtemp + '℃',
inline: true
)
embed.add_field(
name: '最低気温',
value: mintemp + '℃',
inline: true
)
embed.add_field(
name: '午前の降水確率',
value: "0時~6時: #{fallchance[0]}%\n6時~12時: #{fallchance[1]}%",
inline: true
)
embed.add_field(
name: '午後の降水確率',
value: "12時~18時: #{fallchance[2]}%\n18時~24時: #{fallchance[3]}%",
inline: true
)
end
end
end
end

422
weather.json Normal file
View File

@ -0,0 +1,422 @@
[
{
"name": "北海道",
"id": "01",
"area": [
"石狩地方",
"上川地方",
"北見地方",
"十勝地方",
"宗谷地方",
"後志地方",
"日高地方",
"根室地方",
"檜山地方",
"渡島地方",
"留萌地方",
"空知地方",
"紋別地方",
"網走地方",
"胆振地方",
"釧路地方"
]
},
{
"name": "青森",
"id": "02",
"area": [
"津軽",
"三八上北",
"下北"
]
},
{
"name": "岩手",
"id": "03",
"area": [
"内陸",
"沿岸北部",
"沿岸南部"
]
},
{
"name": "宮城",
"id": "04",
"area": [
"東部",
"西部"
]
},
{
"name": "秋田",
"id": "05",
"area": [
"内陸",
"沿岸"
]
},
{
"name": "山形",
"id": "06",
"area": [
"村山",
"庄内",
"最上",
"置賜"
]
},
{
"name": "福島",
"id": "07",
"area": [
"中通り",
"会津",
"浜通り"
]
},
{
"name": "東京",
"id": "13",
"area": [
"東京地方",
"伊豆諸島北部",
"伊豆諸島南部",
"小笠原諸島"
]
},
{
"name": "神奈川",
"id": "14",
"area": [
"東部",
"西部"
]
},
{
"name": "埼玉",
"id": "11",
"area": [
"南部",
"北部",
"秩父地方"
]
},
{
"name": "千葉",
"id": "12",
"area": [
"北西部",
"北東部",
"南部"
]
},
{
"name": "茨城",
"id": "08",
"area": [
"北部",
"南部"
]
},
{
"name": "栃木",
"id": "09",
"area": [
"南部",
"北部"
]
},
{
"name": "群馬",
"id": "10",
"area": [
"南部",
"北部"
]
},
{
"name": "山梨",
"id": "19",
"area": [
"中・西部",
"東部・富士五湖"
]
},
{
"name": "新潟",
"id": "15",
"area": [
"下越",
"上越",
"中越",
"佐渡"
]
},
{
"name": "長野",
"id": "20",
"area": [
"北部",
"中部",
"南部"
]
},
{
"name": "富山",
"id": "16",
"area": [
"東部",
"西部"
]
},
{
"name": "石川",
"id": "17",
"area": [
"加賀",
"能登"
]
},
{
"name": "福井",
"id": "18",
"area": [
"嶺北",
"嶺南"
]
},
{
"name": "愛知",
"id": "23",
"area": [
"西部",
"東部"
]
},
{
"name": "岐阜",
"id": "21",
"area": [
"美濃地方",
"飛騨地方"
]
},
{
"name": "静岡",
"id": "22",
"area": [
"中部",
"伊豆",
"東部",
"西部"
]
},
{
"name": "三重",
"id": "24",
"area": [
"北中部",
"南部"
]
},
{
"name": "大阪",
"id": "27",
"area": []
},
{
"name": "兵庫",
"id": "28",
"area": [
"南部",
"北部"
]
},
{
"name": "京都",
"id": "26",
"area": [
"南部",
"北部"
]
},
{
"name": "滋賀",
"id": "25",
"area": [
"南部",
"北部"
]
},
{
"name": "奈良",
"id": "29",
"area": [
"北部",
"南部"
]
},
{
"name": "和歌山",
"id": "30",
"area": [
"北部",
"南部"
]
},
{
"name": "鳥取",
"id": "31",
"area": [
"東部",
"中・西部"
]
},
{
"name": "島根",
"id": "32",
"area": [
"東部",
"西部",
"隠岐"
]
},
{
"name": "岡山",
"id": "33",
"area": [
"南部",
"北部"
]
},
{
"name": "広島",
"id": "34",
"area": [
"南部",
"北部"
]
},
{
"name": "山口",
"id": "35",
"area": [
"中部",
"北部",
"東部",
"西部"
]
},
{
"name": "徳島",
"id": "36",
"area": [
"北部",
"南部"
]
},
{
"name": "香川",
"id": "37",
"area": []
},
{
"name": "愛媛",
"id": "38",
"area": [
"中予",
"南予",
"東予"
]
},
{
"name": "高知",
"id": "39",
"area": [
"中部",
"東部",
"西部"
]
},
{
"name": "福岡",
"id": "40",
"area": [
"福岡地方",
"北九州地方",
"筑後地方",
"筑豊地方"
]
},
{
"name": "佐賀",
"id": "41",
"area": [
"北部",
"南部"
]
},
{
"name": "長崎",
"id": "42",
"area": [
"南部",
"五島",
"北部",
"壱岐・対馬"
]
},
{
"name": "熊本",
"id": "43",
"area": [
"熊本地方",
"天草・芦北地方",
"球磨地方",
"阿蘇地方"
]
},
{
"name": "大分",
"id": "44",
"area": [
"中部",
"北部",
"南部",
"西部"
]
},
{
"name": "宮崎",
"id": "45",
"area": [
"南部平野部",
"北部山沿い",
"北部平野部",
"南部山沿い"
]
},
{
"name": "鹿児島",
"id": "46",
"area": [
"薩摩地方",
"大隅地方",
"奄美地方",
"種子島地方・屋久島地方"
]
},
{
"name": "沖縄",
"id": "47",
"area": [
"本島中南部",
"本島北部",
"与那国島地方",
"久米島",
"大東島地方",
"宮古島地方",
"石垣島地方"
]
}
]