Esempio n. 1
0
    def cmd_ping(self, msg: tg.Message) -> str:
        # Telegram's timestamps are only accurate to the second... so we have to do it manually
        before = util.time_ms()
        self.mresult(msg, 'Calculating response time...')
        after = util.time_ms()

        return 'Request response time: %.2f ms' % (after - before)
Esempio n. 2
0
    def index_file(self, inp, use_cutoff_freq=False):
        n_indexed = 0
        total_index_time = 0
        cutoff = 10
        max_clause = 1024

        print "indexing:", inp
        for event, elem in cElementTree.iterparse(open(inp)):
            if elem.tag == "{http://www.openarchives.org/OAI/2.0/oai_dc/}dc":
                doc_title = elem.findtext(
                    "{http://purl.org/dc/elements/1.1/}title")
                doc_id = elem.findtext(
                    "{http://purl.org/dc/elements/1.1/}identifier")

                if doc_title and doc_id:  # document id and title are required
                    doc_title = doc_title.replace("\n", " ")
                    doc_id = re.sub("http.+//", "", doc_id)
                    doc = {
                        "id": doc_id,
                        "title": doc_title,
                        "index_time": time_ms()
                    }
                    started = time_ms()

                    abstract = elem.findtext(
                        "{http://purl.org/dc/elements/1.1/}description")
                    if abstract:
                        doc["abstract"] = abstract
                        try:
                            concepts = self.get_concepts(
                                doc_title + ". " + abstract,
                                max_clause,
                                cutoff,
                                doc_id,
                                cutoff_freq=use_cutoff_freq)
                            if concepts:
                                doc["concepts"] = concepts  # TODO: trim to the top n concepts over a certain score?
                        except:
                            print "failed to retrieve concepts for document [" + doc_id + "] - skipping"
                            traceback.print_exc()

                    result = es.index(index="document",
                                      doc_type="abstract",
                                      id=doc_id,
                                      body=doc)
                    # TODO: count failures?
                    elapsed = time_ms() - started
                    total_index_time += elapsed
                    print "indexed document [" + doc_id + "] in " + str(
                        elapsed) + "ms"
                    n_indexed += 1

        # indexing complete for this file - show average indexing time
        avg_index_time = total_index_time / n_indexed
        print "indexing [" + inp + "] complete. average time per document is " + str(
            avg_index_time) + "ms"
Esempio n. 3
0
    def index_file(self, inp, use_cutoff_freq=False):
        context = cElementTree.iterparse(open(inp), events=("start", "end"))
        context = iter(context)
        event, root = context.next()

        for event, elem in context:
            if event == "end" and elem.tag == "{http://www.mediawiki.org/xml/export-0.10/}page":
                page_id = elem.findtext(
                    "{http://www.mediawiki.org/xml/export-0.10/}id")
                page_title = elem.findtext(
                    "{http://www.mediawiki.org/xml/export-0.10/}title")
                revision = elem.find(
                    "{http://www.mediawiki.org/xml/export-0.10/}revision")
                redirect = elem.find(
                    "{http://www.mediawiki.org/xml/export-0.10/}redirect")
                namespace = elem.findtext(
                    "{http://www.mediawiki.org/xml/export-0.10/}ns")

                if redirect is not None:
                    print "skipping redirect:", page_title
                    continue

                if revision is not None and page_title is not None and namespace == "0":
                    markup = revision.findtext(
                        "{http://www.mediawiki.org/xml/export-0.10/}text")
                    try:
                        wikitext = mwparserfromhell.parse(markup).strip_code()
                    except:
                        print "FAILED to parse wiki markup - skipping:"
                        print traceback.print_exc()
                    if page_id and page_title and wikitext:
                        now = time_ms()
                        doc = {
                            "id": page_id,
                            "page_title": page_title,
                            "content": wikitext,
                            "index_time": now
                        }
                        print es.index(index="wikipedia",
                                       doc_type="article",
                                       id=page_id,
                                       body=doc)  # TODO check failure
                else:
                    print "skipping article:", page_title
            root.clear()
Esempio n. 4
0
    def cmd_ping(self, msg):
        before = util.time_ms()
        self.bot.mresult(msg, 'Calculating response time...')
        after = util.time_ms()

        return 'Request response time: %.2f ms' % (after - before)
Esempio n. 5
0
    def cmd_bsetup(self, msg: tg.Message, plain_params: str) -> str:
        if not msg.chat: return '__This can only be used in groups.__'

        cfg_err: str = '''**Invalid TOML config.** The following options are supported:

```
# Bot to setup
target = "MissRose_bot"

# Default rules
rules = ["No spam", "English only", "Respect others", "No NSFW"]
extra_rules = ["No extreme off-topic"]

# Add ":same" at the end of links to put buttons on the same line
[buttons]
"XDA Thread" = "https://forum.xda-developers.com/"
GitHub = "https://github.com/"```

{}'''

        if plain_params.startswith('?') or plain_params.startswith('help'):
            return cfg_err.format('')

        extra_btn: str = ''
        rules: List[str] = [
            'No spam', 'English only', 'Respect others', 'No NSFW',
            'No extreme off-topic'
        ]
        target: str = 'MissRose_bot'

        ex_btn_map: Dict[str, str] = {}

        if plain_params:
            try:
                cfg = toml.loads(plain_params)
            except Exception as e:
                return cfg_err.format(str(e))

            if 'target' in cfg:
                target = cfg['target']

            if 'rules' in cfg:
                rules = cfg['rules']
            if 'extra_rules' in cfg:
                rules.extend(cfg['extra_rules'])

            if 'buttons' in cfg:
                for name, dest in cfg['buttons'].items():
                    ex_btn_map[name] = dest

        rule_str = f'    \u2022 {rules[0]}'
        for rule in rules[1:]:
            rule_str += f'\n    \u2022 {rule}'

        for name, dest in ex_btn_map.items():
            extra_btn += f'\n[{name}](buttonurl://{dest})'

        before = util.time_ms()

        try:
            self.client.promote_chat_member(msg.chat.id,
                                            target,
                                            can_change_info=False)
        except Exception:
            self.mresult(msg, f'**WARNING**: Unable to promote @{target}')

        first = '{first}'
        srules = '{rules}'
        commands: List[str] = [
            'welcome on', 'goodbye off', 'warnlimit 3', 'strongwarn off',
            f'''setwelcome *Welcome*, {first}!
Please read the rules before chatting. {srules}{extra_btn}''',
            'cleanwelcome on', f'setrules \u200b{rule_str}', 'setflood 16',
            'gbanstat on', 'gmutestat on', 'reports on', 'cleanservice on'
        ]

        for cmd in commands:
            csplit = cmd.split(' ')
            _cmd = '/' + csplit[0] + f'@{target} ' + ' '.join(csplit[1:])
            self.client.send_message(msg.chat.id, _cmd, parse_mode='HTML')
            time.sleep(0.180)  # ratelimit

        # Clean up the mess
        if msg.reply_to_message:
            msg.reply_to_message.reply(f'/purge@{target}')
        else:
            msg.reply(f'/purge@{target}')

        after = util.time_ms()

        return f'Finished in `{(after - before) / 1000.0}` seconds.'
Esempio n. 6
0
    async def cmd_ping(self, msg):
        before = util.time_ms()
        await msg.result("Calculating response time...")
        after = util.time_ms()

        return "Request response time: %d ms" % (after - before)