diff --git a/lib/commands/weather.rb b/lib/commands/weather.rb index c612ae8..180e45f 100644 --- a/lib/commands/weather.rb +++ b/lib/commands/weather.rb @@ -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 diff --git a/weather.json b/weather.json new file mode 100644 index 0000000..19974fe --- /dev/null +++ b/weather.json @@ -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": [ + "本島中南部", + "本島北部", + "与那国島地方", + "久米島", + "大東島地方", + "宮古島地方", + "石垣島地方" + ] + } +] \ No newline at end of file