summaryrefslogtreecommitdiff
path: root/searx/plugins/time_zone.py
blob: f54a9ce6ca3e41f93516733feae34be62751f97b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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