Merge branch 'localtime' of github.com:mrvdb/telegram-bot into mrvdb-localtime
This commit is contained in:
		| @@ -1,4 +1,5 @@ | ||||
|   http = require("socket.http") | ||||
|   https = require("ssl.https") | ||||
|   URL = require("socket.url") | ||||
|   json = (loadfile "./bot/JSON.lua")() | ||||
| --  lrexlib = require("rex_pcre") | ||||
|   | ||||
							
								
								
									
										98
									
								
								plugins/time.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								plugins/time.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| -- Implement a command !time [area] which uses | ||||
| -- 2 Google APIs to get the desired result: | ||||
| --   1. Geocoding to get from area to a lat/long pair | ||||
| --   2. Timezone to get the local time in that lat/long location | ||||
|  | ||||
| -- Globals | ||||
| -- If you have a google api key for the geocoding/timezone api | ||||
| api_key  = config.time.api_key or nil | ||||
| base_api = "https://maps.googleapis.com/maps/api" | ||||
| dateFormat = "%A %d %B - %H:%M:%S" | ||||
|  | ||||
| -- Need the utc time for the google api | ||||
| function utctime() | ||||
|    return os.time(os.date("!*t")) | ||||
| end | ||||
|  | ||||
| -- Use the geocoding api to get the lattitude and longitude with accuracy specifier | ||||
| -- CHECKME: this seems to work without a key?? | ||||
| function get_latlong(area) | ||||
|    local api        = base_api .. "/geocode/json?" | ||||
|    local parameters = "address=".. (URL.escape(area) or "") | ||||
|    if api_key ~=nil then | ||||
|       parameters = parameters .. "&key="..api_key | ||||
|    end | ||||
|  | ||||
|    -- Do the request | ||||
|    local res, code = https.request(api..parameters) | ||||
|    if code ~=200 then return nil  end | ||||
|    local data = json:decode(res) | ||||
|   | ||||
|    if (data.status == "ZERO_RESULTS") then | ||||
|       return nil | ||||
|    end | ||||
|    if (data.status == "OK") then | ||||
|       -- Get the data | ||||
|       lat  = data.results[1].geometry.location.lat | ||||
|       lng  = data.results[1].geometry.location.lng | ||||
|       acc  = data.results[1].geometry.location_type | ||||
|       return lat,lng,acc | ||||
|    end | ||||
| end | ||||
|  | ||||
| -- Use timezone api to get the time in the lat, | ||||
| -- Note: this needs an API key | ||||
| function get_time(lat,lng) | ||||
|    local api  = base_api .. "/timezone/json?" | ||||
|  | ||||
|    -- Get a timestamp (server time is relevant here) | ||||
|    local timestamp = utctime() | ||||
|    local parameters = "location=" .. | ||||
|       URL.escape(lat) .. "," .. | ||||
|       URL.escape(lng) ..  | ||||
|       "×tamp="..URL.escape(timestamp) | ||||
|    if api_key ~=nil then | ||||
|       parameters = parameters .. "&key="..api_key | ||||
|    end | ||||
|  | ||||
|    local res,code = https.request(api..parameters) | ||||
|    if code ~= 200 then return nil end | ||||
|    local data = json:decode(res) | ||||
|     | ||||
|    if (data.status == "ZERO_RESULTS") then | ||||
|       return nil | ||||
|    end | ||||
|    if (data.status == "OK") then | ||||
|       -- Construct what we want | ||||
|       -- The local time in the location is: | ||||
|       -- timestamp + rawOffset + dstOffset | ||||
|       local localTime = timestamp + data.rawOffset + data.dstOffset | ||||
|       return localTime | ||||
|    end | ||||
|    return localTime | ||||
| end | ||||
|  | ||||
| function getformattedLocalTime(area) | ||||
|    if area == nil then | ||||
|       return "The time in nowhere is never" | ||||
|    end | ||||
|  | ||||
|    lat,lng,acc = get_latlong(area) | ||||
|    if lat == nil and lng==nil then | ||||
|       return "It seems that in '"..area.."' they do not have a concept of time." | ||||
|    end | ||||
|    local localTime = get_time(lat,lng) | ||||
|  | ||||
|    return "The local time in '"..area.."' is: ".. os.date(dateFormat,localTime)  | ||||
| end | ||||
|  | ||||
| function run(msg, matches) | ||||
|    return getformattedLocalTime(matches[1]) | ||||
| end | ||||
|  | ||||
| return { | ||||
|     description = "Displays the local time in an area",  | ||||
|     usage = "!time [area]", | ||||
|     patterns = {"^!time (.*)$"},  | ||||
|     run = run  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 yago
					yago