diff options
Diffstat (limited to 'searx/plugins')
| -rw-r--r-- | searx/plugins/time_zone.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/searx/plugins/time_zone.py b/searx/plugins/time_zone.py new file mode 100644 index 000000000..f54a9ce6c --- /dev/null +++ b/searx/plugins/time_zone.py @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# pylint: disable=missing-module-docstring + +from __future__ import annotations +import typing as t + +import datetime + +from flask_babel import gettext # type: ignore +from searx.result_types import EngineResults +from searx.weather import DateTime, GeoLocation + +from . import Plugin, PluginInfo + +if t.TYPE_CHECKING: + from searx.search import SearchWithPlugins + from searx.extended_types import SXNG_Request + from searx.plugins import PluginCfg + + +@t.final +class SXNGPlugin(Plugin): + """Plugin to display the current time at different timezones (usually the + query city).""" + + id: str = "time_zone" + keywords: list[str] = ["time", "timezone", "now", "clock", "timezones"] + + def __init__(self, plg_cfg: "PluginCfg"): + super().__init__(plg_cfg) + + self.info = PluginInfo( + id=self.id, + name=gettext("Timezones plugin"), + description=gettext("Display the current time on different time zones."), + preference_section="query", + examples=["time Berlin", "clock Los Angeles"], + ) + + def post_search(self, request: "SXNG_Request", search: "SearchWithPlugins") -> EngineResults: + """The plugin uses the :py:obj:`searx.weather.GeoLocation` class, which + is already implemented in the context of weather forecasts, to determine + the time zone. The :py:obj:`searx.weather.DateTime` class is used for + the localized display of date and time.""" + + results = EngineResults() + if search.search_query.pageno > 1: + return results + + # remove keywords from the query + query = search.search_query.query + query_parts = filter(lambda part: part.lower() not in self.keywords, query.split(" ")) + search_term = " ".join(query_parts).strip() + + if not search_term: + date_time = DateTime(time=datetime.datetime.now()) + results.add(results.types.Answer(answer=date_time.l10n())) + return results + + geo = GeoLocation.by_query(search_term=search_term) + if geo: + date_time = DateTime(time=datetime.datetime.now(tz=geo.zoneinfo)) + tz_name = geo.timezone.replace('_', ' ') + results.add( + results.types.Answer( + answer=(f"{tz_name}:" f" {date_time.l10n()} ({date_time.datetime.strftime('%Z')})") + ) + ) + + return results |