# SPDX-License-Identifier: AGPL-3.0-or-later # pylint: disable=missing-module-docstring from __future__ import annotations import hashlib import random import string import uuid from flask_babel import gettext from searx.result_types import Answer from searx.result_types.answer import BaseAnswer from . import Answerer, AnswererInfo def random_characters(): random_string_letters = string.ascii_lowercase + string.digits + string.ascii_uppercase return [random.choice(random_string_letters) for _ in range(random.randint(8, 32))] def random_string(): return ''.join(random_characters()) def random_float(): return str(random.random()) def random_int(): random_int_max = 2**31 return str(random.randint(-random_int_max, random_int_max)) def random_sha256(): m = hashlib.sha256() m.update(''.join(random_characters()).encode()) return str(m.hexdigest()) def random_uuid(): return str(uuid.uuid4()) def random_color(): color = "%06x" % random.randint(0, 0xFFFFFF) return f"#{color.upper()}" class SXNGAnswerer(Answerer): """Random value generator""" keywords = ["random"] random_types = { "string": random_string, "int": random_int, "float": random_float, "sha256": random_sha256, "uuid": random_uuid, "color": random_color, } def info(self): return AnswererInfo( name=gettext(self.__doc__), description=gettext("Generate different random values"), keywords=self.keywords, examples=[f"random {x}" for x in self.random_types], ) def answer(self, query: str) -> list[BaseAnswer]: parts = query.split() if len(parts) != 2 or parts[1] not in self.random_types: return [] return [Answer(answer=self.random_types[parts[1]]())]