2015-07-11 14:59:00 -04:00
< ? php
2013-02-11 12:49:19 -05:00
/**
2018-01-15 08:15:33 -05:00
* Name : Current Weather
2015-07-11 14:59:00 -04:00
* Description : Shows current weather conditions for user ' s location on their network page .
* Version : 1.1
2013-02-11 12:49:19 -05:00
* Author : Tony Baldwin < http :// friendica . tonybaldwin . info / u / t0ny >
* Author : Fabio Comuni < http :// kirkgroup . com / u / fabrixxm >
2015-07-11 14:59:00 -04:00
* Author : Tobias Diekershoff < https :// f . diekershoff . de / u / tobias >
2013-02-11 12:49:19 -05:00
*
*/
2015-07-11 14:59:00 -04:00
2018-01-22 14:03:11 -05:00
require_once 'mod/proxy.php' ;
require_once 'include/text.php' ;
2015-07-13 10:21:43 -04:00
2018-01-16 19:51:12 -05:00
use Friendica\Core\Addon ;
2017-11-09 11:08:32 -05:00
use Friendica\Core\Cache ;
2017-11-06 18:55:24 -05:00
use Friendica\Core\Config ;
2018-01-22 14:03:11 -05:00
use Friendica\Core\L10n ;
2017-11-06 18:55:24 -05:00
use Friendica\Core\PConfig ;
2018-01-27 08:52:02 -05:00
use Friendica\Util\Network ;
2017-11-06 18:55:24 -05:00
2015-07-13 10:21:43 -04:00
// get the weather data from OpenWeatherMap
2015-07-13 12:45:12 -04:00
function getWeather ( $loc , $units = 'metric' , $lang = 'en' , $appid = '' , $cachetime = 0 ) {
2015-07-13 10:21:43 -04:00
$url = " http://api.openweathermap.org/data/2.5/weather?q= " . $loc . " &appid= " . $appid . " &lang= " . $lang . " &units= " . $units . " &mode=xml " ;
2015-07-13 12:45:12 -04:00
$cached = Cache :: get ( 'curweather' . md5 ( $url ));
$now = new DateTime ();
if ( ! is_null ( $cached )) {
2018-07-20 15:58:53 -04:00
$cdate = PConfig :: get ( local_user (), 'curweather' , 'last' );
$cached = unserialize ( $cached );
if ( $cdate + $cachetime > $now -> getTimestamp ()) {
return $cached ;
}
2015-07-13 12:45:12 -04:00
}
2015-07-13 10:21:43 -04:00
try {
2018-07-20 15:58:53 -04:00
$res = new SimpleXMLElement ( Network :: fetchUrl ( $url ));
2015-07-13 10:21:43 -04:00
} catch ( Exception $e ) {
2018-07-20 15:58:53 -04:00
if ( ! $_SESSION [ 'curweather_notice_shown' ]) {
info ( L10n :: t ( 'Error fetching weather data. Error was: ' . $e -> getMessage ()));
$_SESSION [ 'curweather_notice_shown' ] = true ;
}
return false ;
2015-07-13 10:21:43 -04:00
}
2018-07-20 15:58:53 -04:00
unset ( $_SESSION [ 'curweather_notice_shown' ]);
2015-07-13 10:21:43 -04:00
if (( string ) $res -> temperature [ 'unit' ] === 'metric' ) {
2018-07-20 15:58:53 -04:00
$tunit = '°C' ;
$wunit = 'm/s' ;
2015-07-13 10:21:43 -04:00
} else {
2018-07-20 15:58:53 -04:00
$tunit = '°F' ;
$wunit = 'mph' ;
2015-07-13 10:21:43 -04:00
}
2015-07-15 07:15:02 -04:00
if ( trim (( string ) $res -> weather [ 'value' ]) == trim (( string ) $res -> clouds [ 'name' ]) ) {
2018-07-20 15:58:53 -04:00
$desc = ( string ) $res -> clouds [ 'name' ];
2015-07-15 07:15:02 -04:00
} else {
2018-07-20 15:58:53 -04:00
$desc = ( string ) $res -> weather [ 'value' ] . ', ' . ( string ) $res -> clouds [ 'name' ];
2015-07-15 07:15:02 -04:00
}
2018-01-15 08:15:33 -05:00
$r = [
2018-07-20 15:58:53 -04:00
'city' => ( string ) $res -> city [ 'name' ][ 0 ],
'country' => ( string ) $res -> city -> country [ 0 ],
'lat' => ( string ) $res -> city -> coord [ 'lat' ],
'lon' => ( string ) $res -> city -> coord [ 'lon' ],
'temperature' => ( string ) $res -> temperature [ 'value' ][ 0 ] . $tunit ,
'pressure' => ( string ) $res -> pressure [ 'value' ] . ( string ) $res -> pressure [ 'unit' ],
'humidity' => ( string ) $res -> humidity [ 'value' ] . ( string ) $res -> humidity [ 'unit' ],
'descripion' => $desc ,
'wind' => ( string ) $res -> wind -> speed [ 'name' ] . ' (' . ( string ) $res -> wind -> speed [ 'value' ] . $wunit . ')' ,
'update' => ( string ) $res -> lastupdate [ 'value' ],
'icon' => ( string ) $res -> weather [ 'icon' ]
2018-01-15 08:15:33 -05:00
];
2017-11-06 18:55:24 -05:00
PConfig :: set ( local_user (), 'curweather' , 'last' , $now -> getTimestamp ());
2015-09-13 02:30:40 -04:00
Cache :: set ( 'curweather' . md5 ( $url ), serialize ( $r ), CACHE_HOUR );
2015-07-13 12:45:12 -04:00
return $r ;
2015-07-13 10:21:43 -04:00
}
2013-02-11 12:49:19 -05:00
2018-01-20 08:57:41 -05:00
function curweather_install ()
{
2018-07-20 15:58:53 -04:00
Addon :: registerHook ( 'network_mod_init' , 'addon/curweather/curweather.php' , 'curweather_network_mod_init' );
Addon :: registerHook ( 'addon_settings' , 'addon/curweather/curweather.php' , 'curweather_addon_settings' );
Addon :: registerHook ( 'addon_settings_post' , 'addon/curweather/curweather.php' , 'curweather_addon_settings_post' );
2013-02-11 12:49:19 -05:00
}
function curweather_uninstall () {
2018-07-20 15:58:53 -04:00
Addon :: unregisterHook ( 'network_mod_init' , 'addon/curweather/curweather.php' , 'curweather_network_mod_init' );
Addon :: unregisterHook ( 'addon_settings' , 'addon/curweather/curweather.php' , 'curweather_addon_settings' );
Addon :: unregisterHook ( 'addon_settings_post' , 'addon/curweather/curweather.php' , 'curweather_addon_settings_post' );
2013-02-11 12:49:19 -05:00
}
function curweather_network_mod_init ( & $fk_app , & $b ) {
2017-11-06 18:55:24 -05:00
if ( ! intval ( PConfig :: get ( local_user (), 'curweather' , 'curweather_enable' )))
2013-02-11 12:49:19 -05:00
return ;
$fk_app -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $fk_app -> get_baseurl () . '/addon/curweather/curweather.css' . '" media="all" />' . " \r \n " ;
2015-07-15 07:15:02 -04:00
// $rpt value is needed for location
2015-07-12 02:18:24 -04:00
// $lang will be taken from the browser session to honour user settings
2015-07-15 07:15:02 -04:00
// TODO $lang does not work if the default settings are used
// and not all response strings are translated
2015-07-12 02:18:24 -04:00
// $units can be set in the settings by the user
// $appid is configured by the admin in the admin panel
// those parameters will be used to get: cloud status, temperature, preassure
// and relative humidity for display, also the relevent area of the map is
// linked from lat/log of the reply of OWMp
2017-11-06 18:55:24 -05:00
$rpt = PConfig :: get ( local_user (), 'curweather' , 'curweather_loc' );
2015-07-11 14:59:00 -04:00
// set the language to the browsers language and use metric units
$lang = $_SESSION [ 'language' ];
2017-11-06 18:55:24 -05:00
$units = PConfig :: get ( local_user (), 'curweather' , 'curweather_units' );
$appid = Config :: get ( 'curweather' , 'appid' );
$cachetime = intval ( Config :: get ( 'curweather' , 'cachetime' ));
2015-07-11 14:59:00 -04:00
if ( $units === " " )
2018-07-20 15:58:53 -04:00
$units = 'metric' ;
2015-07-13 05:22:51 -04:00
$ok = true ;
2015-07-13 12:45:12 -04:00
$res = getWeather ( $rpt , $units , $lang , $appid , $cachetime );
2015-07-13 10:21:43 -04:00
if ( $res === false )
2018-07-20 15:58:53 -04:00
$ok = false ;
2015-07-11 14:59:00 -04:00
2015-07-13 05:22:51 -04:00
if ( $ok ) {
2018-07-20 15:58:53 -04:00
$t = get_markup_template ( " widget.tpl " , " addon/curweather/ " );
$curweather = replace_macros ( $t , [
'$title' => L10n :: t ( " Current Weather " ),
'$icon' => proxy_url ( 'http://openweathermap.org/img/w/' . $res [ 'icon' ] . '.png' ),
'$city' => $res [ 'city' ],
'$lon' => $res [ 'lon' ],
'$lat' => $res [ 'lat' ],
'$description' => $res [ 'descripion' ],
'$temp' => $res [ 'temperature' ],
'$relhumidity' => [ 'caption' => L10n :: t ( 'Relative Humidity' ), 'val' => $res [ 'humidity' ]],
'$pressure' => [ 'caption' => L10n :: t ( 'Pressure' ), 'val' => $res [ 'pressure' ]],
'$wind' => [ 'caption' => L10n :: t ( 'Wind' ), 'val' => $res [ 'wind' ]],
'$lastupdate' => L10n :: t ( 'Last Updated' ) . ': ' . $res [ 'update' ] . 'UTC' ,
'$databy' => L10n :: t ( 'Data by' ),
'$showonmap' => L10n :: t ( 'Show on map' )
]);
2015-07-13 05:22:51 -04:00
} else {
2018-07-20 15:58:53 -04:00
$t = get_markup_template ( 'widget-error.tpl' , 'addon/curweather/' );
$curweather = replace_macros ( $t , [
'$problem' => L10n :: t ( 'There was a problem accessing the weather data. But have a look' ),
'$rpt' => $rpt ,
'$atOWM' => L10n :: t ( 'at OpenWeatherMap' )
]);
2015-07-13 05:22:51 -04:00
}
2013-02-11 12:49:19 -05:00
$fk_app -> page [ 'aside' ] = $curweather . $fk_app -> page [ 'aside' ];
}
2018-01-20 08:57:41 -05:00
function curweather_addon_settings_post ( $a , $post ) {
2018-07-20 15:58:53 -04:00
if ( ! local_user () || ( ! x ( $_POST , 'curweather-settings-submit' )))
return ;
PConfig :: set ( local_user (), 'curweather' , 'curweather_loc' , trim ( $_POST [ 'curweather_loc' ]));
PConfig :: set ( local_user (), 'curweather' , 'curweather_enable' , intval ( $_POST [ 'curweather_enable' ]));
PConfig :: set ( local_user (), 'curweather' , 'curweather_units' , trim ( $_POST [ 'curweather_units' ]));
info ( L10n :: t ( 'Current Weather settings updated.' ) . EOL );
2013-02-11 12:49:19 -05:00
}
2018-01-20 08:57:41 -05:00
function curweather_addon_settings ( & $a , & $s ) {
2013-02-11 12:49:19 -05:00
2018-07-20 15:58:53 -04:00
if ( ! local_user ())
return ;
/* Get the current state of our config variable */
$curweather_loc = PConfig :: get ( local_user (), 'curweather' , 'curweather_loc' );
$curweather_units = PConfig :: get ( local_user (), 'curweather' , 'curweather_units' );
$appid = Config :: get ( 'curweather' , 'appid' );
if ( $appid == " " ) {
$noappidtext = L10n :: t ( 'No APPID found, please contact your admin to obtain one.' );
} else {
$noappidtext = '' ;
}
$enable = intval ( PConfig :: get ( local_user (), 'curweather' , 'curweather_enable' ));
$enable_checked = (( $enable ) ? ' checked="checked" ' : '' );
// load template and replace the macros
$t = get_markup_template ( " settings.tpl " , " addon/curweather/ " );
$s = replace_macros ( $t , [
'$submit' => L10n :: t ( 'Save Settings' ),
'$header' => L10n :: t ( 'Current Weather' ) . ' ' . L10n :: t ( 'Settings' ),
'$noappidtext' => $noappidtext ,
'$info' => L10n :: t ( 'Enter either the name of your location or the zip code.' ),
'$curweather_loc' => [ 'curweather_loc' , L10n :: t ( 'Your Location' ), $curweather_loc , L10n :: t ( 'Identifier of your location (name or zip code), e.g. <em>Berlin,DE</em> or <em>14476,DE</em>.' ) ],
'$curweather_units' => [ 'curweather_units' , L10n :: t ( 'Units' ), $curweather_units , L10n :: t ( 'select if the temperature should be displayed in °C or °F' ), [ 'metric' => '°C' , 'imperial' => '°F' ]],
'$enabled' => [ 'curweather_enable' , L10n :: t ( 'Show weather data' ), $enable , '' ]
]);
return ;
2013-02-11 12:49:19 -05:00
}
2018-07-20 15:58:53 -04:00
2015-07-11 14:59:00 -04:00
// Config stuff for the admin panel to let the admin of the node set a APPID
// for accessing the API of openweathermap
2018-01-20 08:57:41 -05:00
function curweather_addon_admin_post ( & $a ) {
2018-07-20 15:58:53 -04:00
if ( ! is_site_admin ())
return ;
if ( $_POST [ 'curweather-submit' ]) {
Config :: set ( 'curweather' , 'appid' , trim ( $_POST [ 'appid' ]));
Config :: set ( 'curweather' , 'cachetime' , trim ( $_POST [ 'cachetime' ]));
info ( L10n :: t ( 'Curweather settings saved.' . EOL ));
}
2015-07-11 14:59:00 -04:00
}
2018-07-20 15:58:53 -04:00
2018-01-20 08:57:41 -05:00
function curweather_addon_admin ( & $a , & $o ) {
2015-07-11 14:59:00 -04:00
if ( ! is_site_admin ())
2018-07-20 15:58:53 -04:00
return ;
2017-11-06 18:55:24 -05:00
$appid = Config :: get ( 'curweather' , 'appid' );
$cachetime = Config :: get ( 'curweather' , 'cachetime' );
2015-07-11 14:59:00 -04:00
$t = get_markup_template ( " admin.tpl " , " addon/curweather/ " );
2018-07-20 15:58:53 -04:00
$o = replace_macros ( $t , [
'$submit' => L10n :: t ( 'Save Settings' ),
'$cachetime' => [
'cachetime' ,
L10n :: t ( 'Caching Interval' ),
$cachetime ,
L10n :: t ( 'For how long should the weather data be cached? Choose according your OpenWeatherMap account type.' ), [
'0' => L10n :: t ( 'no cache' ),
'300' => '5 ' . L10n :: t ( 'minutes' ),
'900' => '15 ' . L10n :: t ( 'minutes' ),
'1800' => '30 ' . L10n :: t ( 'minutes' ),
'3600' => '60 ' . L10n :: t ( 'minutes' )
]
],
'$appid' => [ 'appid' , L10n :: t ( 'Your APPID' ), $appid , L10n :: t ( 'Your API key provided by OpenWeatherMap' )]
2018-01-15 08:15:33 -05:00
]);
2015-07-11 14:59:00 -04:00
}