2015-07-11 20:59:00 +02:00
< ? php
2013-02-11 18:49:19 +01:00
/**
2018-01-15 14:15:33 +01:00
* Name : Current Weather
2015-07-11 20:59:00 +02:00
* Description : Shows current weather conditions for user ' s location on their network page .
2019-04-24 09:34:21 +02:00
* Version : 1.2
2013-02-11 18:49:19 +01:00
* Author : Tony Baldwin < http :// friendica . tonybaldwin . info / u / t0ny >
* Author : Fabio Comuni < http :// kirkgroup . com / u / fabrixxm >
2015-07-11 20:59:00 +02:00
* Author : Tobias Diekershoff < https :// f . diekershoff . de / u / tobias >
2013-02-11 18:49:19 +01:00
*
*/
2015-07-11 20:59:00 +02:00
2018-07-25 02:18:59 +02:00
use Friendica\App ;
2020-01-19 16:35:10 +01:00
use Friendica\Core\Cache\Duration ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-10-31 15:55:15 +01:00
use Friendica\Core\Renderer ;
2019-10-13 18:07:27 +02:00
use Friendica\Core\Session ;
2019-12-16 01:05:14 +01:00
use Friendica\DI ;
2018-07-31 03:20:29 +02:00
use Friendica\Util\Proxy as ProxyUtils ;
2017-11-07 00:55:24 +01:00
2018-07-25 02:18:59 +02:00
function curweather_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'network_mod_init' , 'addon/curweather/curweather.php' , 'curweather_network_mod_init' );
Hook :: register ( 'addon_settings' , 'addon/curweather/curweather.php' , 'curweather_addon_settings' );
Hook :: register ( 'addon_settings_post' , 'addon/curweather/curweather.php' , 'curweather_addon_settings_post' );
2018-07-25 02:18:59 +02:00
}
2015-07-13 16:21:43 +02:00
// get the weather data from OpenWeatherMap
2018-07-25 02:18:59 +02:00
function getWeather ( $loc , $units = 'metric' , $lang = 'en' , $appid = '' , $cachetime = 0 )
{
$url = " http://api.openweathermap.org/data/2.5/weather?q= " . $loc . " &appid= " . $appid . " &lang= " . $lang . " &units= " . $units . " &mode=xml " ;
2020-01-19 16:35:10 +01:00
$cached = DI :: cache () -> get ( 'curweather' . md5 ( $url ));
2018-07-23 23:06:09 +02:00
$now = new DateTime ();
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
if ( ! is_null ( $cached )) {
2020-01-18 16:50:56 +01:00
$cdate = DI :: pConfig () -> get ( local_user (), 'curweather' , 'last' );
2018-07-23 23:06:09 +02:00
$cached = unserialize ( $cached );
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
if ( $cdate + $cachetime > $now -> getTimestamp ()) {
return $cached ;
}
}
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
try {
2020-03-04 22:35:39 +01:00
$res = new SimpleXMLElement ( DI :: httpRequest () -> fetch ( $url ));
2018-07-23 23:06:09 +02:00
} catch ( Exception $e ) {
2018-07-25 02:18:59 +02:00
if ( empty ( $_SESSION [ 'curweather_notice_shown' ])) {
2020-07-23 08:07:17 +02:00
notice ( DI :: l10n () -> t ( 'Error fetching weather data. Error was: ' . $e -> getMessage ()));
2018-07-23 23:06:09 +02:00
$_SESSION [ 'curweather_notice_shown' ] = true ;
}
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
return false ;
}
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
unset ( $_SESSION [ 'curweather_notice_shown' ]);
2018-07-25 02:18:59 +02:00
2019-04-24 09:29:32 +02:00
if ( in_array (( string ) $res -> temperature [ 'unit' ], [ 'celsius' , 'metric' ])) {
2018-07-23 23:06:09 +02:00
$tunit = '°C' ;
$wunit = 'm/s' ;
} else {
$tunit = '°F' ;
$wunit = 'mph' ;
}
2018-07-25 02:18:59 +02:00
if ( trim (( string ) $res -> weather [ 'value' ]) == trim (( string ) $res -> clouds [ 'name' ])) {
$desc = ( string ) $res -> clouds [ 'name' ];
2018-07-23 23:06:09 +02:00
} else {
2018-07-25 02:18:59 +02:00
$desc = ( string ) $res -> weather [ 'value' ] . ', ' . ( string ) $res -> clouds [ 'name' ];
2018-07-23 23:06:09 +02:00
}
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
$r = [
2018-07-25 02:18:59 +02: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' ],
2018-07-23 23:06:09 +02:00
'temperature' => ( string ) $res -> temperature [ 'value' ][ 0 ] . $tunit ,
2018-07-25 02:18:59 +02:00
'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-07-23 23:06:09 +02:00
];
2018-07-25 02:18:59 +02:00
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'curweather' , 'last' , $now -> getTimestamp ());
2020-01-19 16:35:10 +01:00
DI :: cache () -> set ( 'curweather' . md5 ( $url ), serialize ( $r ), Duration :: HOUR );
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
return $r ;
2015-07-13 16:21:43 +02:00
}
2013-02-11 18:49:19 +01:00
2018-07-25 02:18:59 +02:00
function curweather_network_mod_init ( App $a , & $b )
2018-01-20 14:57:41 +01:00
{
2020-01-18 16:50:56 +01:00
if ( ! intval ( DI :: pConfig () -> get ( local_user (), 'curweather' , 'curweather_enable' ))) {
2018-07-23 23:06:09 +02:00
return ;
2018-07-25 02:18:59 +02:00
}
2018-07-23 23:06:09 +02:00
2019-12-30 20:02:08 +01:00
DI :: page ()[ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . DI :: baseUrl () -> get () . '/addon/curweather/curweather.css' . '" media="all" />' . " \r \n " ;
2018-07-23 23:06:09 +02:00
// $rpt value is needed for location
// $lang will be taken from the browser session to honour user settings
// TODO $lang does not work if the default settings are used
// and not all response strings are translated
// $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
2020-01-18 16:50:56 +01:00
$rpt = DI :: pConfig () -> get ( local_user (), 'curweather' , 'curweather_loc' );
2018-07-23 23:06:09 +02:00
2018-07-25 02:18:59 +02:00
// Set the language to the browsers language or default and use metric units
2020-01-19 21:21:12 +01:00
$lang = Session :: get ( 'language' , DI :: config () -> get ( 'system' , 'language' ));
2020-01-18 16:50:56 +01:00
$units = DI :: pConfig () -> get ( local_user (), 'curweather' , 'curweather_units' );
2020-01-19 21:21:12 +01:00
$appid = DI :: config () -> get ( 'curweather' , 'appid' );
$cachetime = intval ( DI :: config () -> get ( 'curweather' , 'cachetime' ));
2018-07-25 02:18:59 +02:00
if ( $units === " " ) {
2018-07-23 23:06:09 +02:00
$units = 'metric' ;
2018-07-25 02:18:59 +02:00
}
2018-07-23 23:06:09 +02:00
$ok = true ;
$res = getWeather ( $rpt , $units , $lang , $appid , $cachetime );
2018-07-25 02:18:59 +02:00
if ( $res === false ) {
2018-07-23 23:06:09 +02:00
$ok = false ;
2018-07-25 02:18:59 +02:00
}
2018-07-23 23:06:09 +02:00
if ( $ok ) {
2018-10-31 15:55:15 +01:00
$t = Renderer :: getMarkupTemplate ( " widget.tpl " , " addon/curweather/ " );
2018-10-31 16:06:15 +01:00
$curweather = Renderer :: replaceMacros ( $t , [
2020-01-18 20:52:33 +01:00
'$title' => DI :: l10n () -> t ( " Current Weather " ),
2018-07-28 20:24:16 +02:00
'$icon' => ProxyUtils :: proxifyUrl ( 'http://openweathermap.org/img/w/' . $res [ 'icon' ] . '.png' ),
2018-07-23 23:06:09 +02:00
'$city' => $res [ 'city' ],
'$lon' => $res [ 'lon' ],
'$lat' => $res [ 'lat' ],
'$description' => $res [ 'descripion' ],
'$temp' => $res [ 'temperature' ],
2020-01-18 20:52:33 +01:00
'$relhumidity' => [ 'caption' => DI :: l10n () -> t ( 'Relative Humidity' ), 'val' => $res [ 'humidity' ]],
'$pressure' => [ 'caption' => DI :: l10n () -> t ( 'Pressure' ), 'val' => $res [ 'pressure' ]],
'$wind' => [ 'caption' => DI :: l10n () -> t ( 'Wind' ), 'val' => $res [ 'wind' ]],
'$lastupdate' => DI :: l10n () -> t ( 'Last Updated' ) . ': ' . $res [ 'update' ] . 'UTC' ,
'$databy' => DI :: l10n () -> t ( 'Data by' ),
'$showonmap' => DI :: l10n () -> t ( 'Show on map' )
2018-07-23 23:06:09 +02:00
]);
} else {
2018-10-31 15:55:15 +01:00
$t = Renderer :: getMarkupTemplate ( 'widget-error.tpl' , 'addon/curweather/' );
$curweather = Renderer :: replaceMacros ( $t , [
2020-01-18 20:52:33 +01:00
'$problem' => DI :: l10n () -> t ( 'There was a problem accessing the weather data. But have a look' ),
2018-07-23 23:06:09 +02:00
'$rpt' => $rpt ,
2020-01-18 20:52:33 +01:00
'$atOWM' => DI :: l10n () -> t ( 'at OpenWeatherMap' )
2018-07-23 23:06:09 +02:00
]);
}
2019-12-30 20:02:08 +01:00
DI :: page ()[ 'aside' ] = $curweather . DI :: page ()[ 'aside' ];
2013-02-11 18:49:19 +01:00
}
2018-07-25 02:18:59 +02:00
function curweather_addon_settings_post ( App $a , $post )
{
if ( ! local_user () || empty ( $_POST [ 'curweather-settings-submit' ])) {
2018-07-23 23:06:09 +02:00
return ;
2018-07-25 02:18:59 +02:00
}
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'curweather' , 'curweather_loc' , trim ( $_POST [ 'curweather_loc' ]));
DI :: pConfig () -> set ( local_user (), 'curweather' , 'curweather_enable' , intval ( $_POST [ 'curweather_enable' ]));
DI :: pConfig () -> set ( local_user (), 'curweather' , 'curweather_units' , trim ( $_POST [ 'curweather_units' ]));
2013-02-11 18:49:19 +01:00
}
2018-07-25 02:18:59 +02:00
function curweather_addon_settings ( App $a , & $s )
{
if ( ! local_user ()) {
2018-07-23 23:06:09 +02:00
return ;
2018-07-25 02:18:59 +02:00
}
2018-07-23 23:06:09 +02:00
/* Get the current state of our config variable */
2020-01-18 16:50:56 +01:00
$curweather_loc = DI :: pConfig () -> get ( local_user (), 'curweather' , 'curweather_loc' );
$curweather_units = DI :: pConfig () -> get ( local_user (), 'curweather' , 'curweather_units' );
2020-01-19 21:21:12 +01:00
$appid = DI :: config () -> get ( 'curweather' , 'appid' );
2018-07-25 02:18:59 +02:00
if ( $appid == " " ) {
2020-01-18 20:52:33 +01:00
$noappidtext = DI :: l10n () -> t ( 'No APPID found, please contact your admin to obtain one.' );
2018-07-23 23:06:09 +02:00
} else {
$noappidtext = '' ;
}
2018-07-25 02:18:59 +02:00
2020-01-18 16:50:56 +01:00
$enable = intval ( DI :: pConfig () -> get ( local_user (), 'curweather' , 'curweather_enable' ));
2018-07-23 23:06:09 +02:00
$enable_checked = (( $enable ) ? ' checked="checked" ' : '' );
// load template and replace the macros
2018-10-31 15:55:15 +01:00
$t = Renderer :: getMarkupTemplate ( " settings.tpl " , " addon/curweather/ " );
2018-07-25 02:18:59 +02:00
2018-10-31 16:06:15 +01:00
$s = Renderer :: replaceMacros ( $t , [
2020-01-18 20:52:33 +01:00
'$submit' => DI :: l10n () -> t ( 'Save Settings' ),
'$header' => DI :: l10n () -> t ( 'Current Weather' ) . ' ' . DI :: l10n () -> t ( 'Settings' ),
2018-07-23 23:06:09 +02:00
'$noappidtext' => $noappidtext ,
2020-01-18 20:52:33 +01:00
'$info' => DI :: l10n () -> t ( 'Enter either the name of your location or the zip code.' ),
'$curweather_loc' => [ 'curweather_loc' , DI :: l10n () -> t ( 'Your Location' ), $curweather_loc , DI :: 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' , DI :: l10n () -> t ( 'Units' ), $curweather_units , DI :: l10n () -> t ( 'select if the temperature should be displayed in °C or °F' ), [ 'metric' => '°C' , 'imperial' => '°F' ]],
'$enabled' => [ 'curweather_enable' , DI :: l10n () -> t ( 'Show weather data' ), $enable , '' ]
2018-07-23 23:06:09 +02:00
]);
2018-07-25 02:18:59 +02:00
2018-07-23 23:06:09 +02:00
return ;
2013-02-11 18:49:19 +01:00
}
2018-07-20 21:58:53 +02:00
2015-07-11 20:59:00 +02:00
// Config stuff for the admin panel to let the admin of the node set a APPID
// for accessing the API of openweathermap
2018-07-25 02:18:59 +02:00
function curweather_addon_admin_post ( App $a )
{
if ( ! is_site_admin ()) {
2018-07-23 23:06:09 +02:00
return ;
2018-07-25 02:18:59 +02:00
}
if ( ! empty ( $_POST [ 'curweather-submit' ])) {
2020-01-19 21:21:52 +01:00
DI :: config () -> set ( 'curweather' , 'appid' , trim ( $_POST [ 'appid' ]));
DI :: config () -> set ( 'curweather' , 'cachetime' , trim ( $_POST [ 'cachetime' ]));
2018-07-23 23:06:09 +02:00
}
2015-07-11 20:59:00 +02:00
}
2018-07-20 21:58:53 +02:00
2018-07-25 02:18:59 +02:00
function curweather_addon_admin ( App $a , & $o )
{
if ( ! is_site_admin ()) {
2018-07-23 23:06:09 +02:00
return ;
2018-07-25 02:18:59 +02:00
}
2020-01-19 21:21:12 +01:00
$appid = DI :: config () -> get ( 'curweather' , 'appid' );
$cachetime = DI :: config () -> get ( 'curweather' , 'cachetime' );
2018-07-25 02:18:59 +02:00
2018-10-31 15:55:15 +01:00
$t = Renderer :: getMarkupTemplate ( " admin.tpl " , " addon/curweather/ " );
2018-07-25 02:18:59 +02:00
2018-10-31 16:06:15 +01:00
$o = Renderer :: replaceMacros ( $t , [
2020-01-18 20:52:33 +01:00
'$submit' => DI :: l10n () -> t ( 'Save Settings' ),
2018-07-23 23:06:09 +02:00
'$cachetime' => [
2018-07-25 02:18:59 +02:00
'cachetime' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Caching Interval' ),
2018-07-25 02:18:59 +02:00
$cachetime ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'For how long should the weather data be cached? Choose according your OpenWeatherMap account type.' ), [
'0' => DI :: l10n () -> t ( 'no cache' ),
'300' => '5 ' . DI :: l10n () -> t ( 'minutes' ),
'900' => '15 ' . DI :: l10n () -> t ( 'minutes' ),
'1800' => '30 ' . DI :: l10n () -> t ( 'minutes' ),
'3600' => '60 ' . DI :: l10n () -> t ( 'minutes' )
2018-07-23 23:06:09 +02:00
]
],
2020-01-18 20:52:33 +01:00
'$appid' => [ 'appid' , DI :: l10n () -> t ( 'Your APPID' ), $appid , DI :: l10n () -> t ( 'Your API key provided by OpenWeatherMap' )]
2018-07-23 23:06:09 +02:00
]);
2015-07-11 20:59:00 +02:00
}