Skip to content

Commit

Permalink
add per-language highlights
Browse files Browse the repository at this point in the history
  • Loading branch information
TicClick committed Feb 11, 2021
1 parent 1e0f24b commit 23e70c7
Show file tree
Hide file tree
Showing 10 changed files with 93 additions and 43 deletions.
6 changes: 3 additions & 3 deletions config/config.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

github:
token: "abcdefgh" # https://github.com/settings/tokens
assignee_login: "TicClick"
repo: "someone/osu-wiki"
title_regex: ^\[(\w+.?)?RU(.+)?\]
assignee_login: null
repo: "ppy/osu-wiki"

discord:
token: "abc.def.ghi" # bot token from https://discord.com/developers/applications
review_channel: 67890
review_role_id: 12345
language_code: "ru"
store_in_pins: true

runtime:
Expand Down
39 changes: 9 additions & 30 deletions librarian/discord/bot.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import asyncio
import logging
import random
import re

import discord
from discord.ext import commands

from librarian.discord import formatters
from librarian.discord import (
formatters,
languages,
)
from librarian.discord.cogs import (
pulls,
system,
Expand All @@ -19,35 +20,12 @@
logger = logging.getLogger(__name__)


GREETINGS = [
"a new wiki article is just a click away:",
u"время исправлять чужие ошибки:",
u"вышла новая книга Владимира Сорокина:",
u"на GitHub опять что-то перевели:",
u"хороших выходных:",
u"объясняем на карточках вместе с Медузой:",
u"вот ещё кое-что:",
u"пожалуйста, взгляните:",
u"доставайте красные карандаши:",
u"если некуда девать свободное время:",
u"новый пулл-реквест на небосклоне:",
u"у нас на один перевод больше:",
u"произошло что-то интересное:",
u"у вас одно новое сообщение:",
u"перевод? перевод!",
u"вам письмо от неанонимного доброжелателя:",
u"здесь могла быть ваша реклама:",
u"нужна помощь:",
"`wiki.by_language('russian').inflight_translations += 1`",
]


class Client(commands.Bot):
COMMAND_PREFIX = "."
KILL_TIMEOUT = 10

def __init__(
self, *args, github=None, storage=None, assignee_login=None, title_regex=None,
self, *args, github=None, storage=None, assignee_login=None, language_code=None,
review_channel=None, review_role_id=None, store_in_pins=False,
**kwargs
):
Expand All @@ -56,17 +34,18 @@ def __init__(

self.review_channel = review_channel
self.review_role_id = review_role_id
self.title_regex = re.compile(title_regex)
self.assignee_login = assignee_login
self.store_in_pins = store_in_pins

self.language = languages.LanguageMeta.get(language_code)

super().__init__(*args, command_prefix=self.COMMAND_PREFIX, **kwargs)

def setup(self):
self.add_cog(pulls.Pulls())
self.add_cog(system.System())
self.add_cog(github_cogs.FetchNewPulls(self))
self.add_cog(github_cogs.MonitorPulls(self, assignee_login=self.assignee_login, title_regex=self.title_regex))
self.add_cog(github_cogs.MonitorPulls(self))

async def start_routines(self):
logger.debug("Starting cogs")
Expand All @@ -88,7 +67,7 @@ async def post_update(self, pull=None, channel_id=None, message_id=None):
return

logger.debug("Update requested for pull #%s: message #%s of channel #%s", pull.number, message_id, channel_id)
content = "<@&{}>, {}".format(self.review_role_id, random.choice(GREETINGS))
content = "<@&{}>, {}".format(self.review_role_id, self.language.random_highlight)
embed = formatters.PullFormatter.make_embed_for(pull, self.github.repo)

channel = self.get_channel(channel_id or self.review_channel)
Expand Down
6 changes: 3 additions & 3 deletions librarian/discord/cogs/background/github.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,10 @@ class MonitorPulls(base.BackgroundCog):
INTERVAL = 60
CUTOFF_PULL_NUMBER = 4450

def __init__(self, bot, assignee_login=None, title_regex=None, *args, **kwargs):
def __init__(self, bot, *args, **kwargs):
super().__init__(bot, *args, **kwargs)
self.assignee_login = assignee_login
self.title_regex = title_regex
self.assignee_login = bot.assignee_login
self.title_regex = bot.language.title_regex

async def act_on_pulls(self, pulls):
selected_pulls = [
Expand Down
2 changes: 1 addition & 1 deletion librarian/discord/cogs/pulls.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ async def count(self, ctx: commands.Context, *args):

pulls = ctx.bot.storage.pulls.count_merged(start_date=start_date.datetime, end_date=end_date.datetime)
pulls = sorted(
filter(lambda p: ctx.bot.title_regex.match(p.title), pulls),
filter(lambda p: ctx.bot.language.title_regex.match(p.title), pulls),
key=lambda p: p.merged_at
)
logger.debug(
Expand Down
6 changes: 6 additions & 0 deletions librarian/discord/languages/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .base import LanguageMeta # noqa
from . import (
ru,
)

__all__ = ("ru",)
39 changes: 39 additions & 0 deletions librarian/discord/languages/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import random
import re


class LanguageMeta(type):
code = "langcode"
highlights = [
"a new wiki article is just a click away:",
"does that seem promising?",
"please take a look",
"there's a change waiting for reviews to happen:",
]

__languages = {}

def __new__(mcs, name, bases, attrs):
cls = super().__new__(mcs, name, bases, attrs)
if name != "Language":
assert cls.code not in mcs.__languages, f"there's already a language class with the code {cls.code!r}"
mcs.__languages[cls.code] = cls
return cls

@property
def title_regex(mcs):
if not hasattr(mcs, "__regex"):
mcs.__regex = re.compile(r"^\[(\w+.?)?{}(.+)?\]".format(mcs.code.upper()))
return mcs.__regex

@property
def random_highlight(mcs):
return random.choice(mcs.HIGHLIGHTS)

@classmethod
def get(mcs, langcode):
return mcs.__languages[langcode]


class Language(metaclass=LanguageMeta):
pass
26 changes: 26 additions & 0 deletions librarian/discord/languages/ru.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from librarian.discord.languages import base


class Russian(base.Language):
code = "ru"
highlights = [
"a new wiki article is just a click away:",
u"время исправлять чужие ошибки:",
u"вышла новая книга Владимира Сорокина:",
u"на GitHub опять что-то перевели:",
u"хороших выходных:",
u"объясняем на карточках вместе с Медузой:",
u"вот ещё кое-что:",
u"пожалуйста, взгляните:",
u"доставайте красные карандаши:",
u"если некуда девать свободное время:",
u"новый пулл-реквест на небосклоне:",
u"у нас на один перевод больше:",
u"произошло что-то интересное:",
u"у вас одно новое сообщение:",
u"перевод? перевод!",
u"вам письмо от неанонимного доброжелателя:",
u"здесь могла быть ваша реклама:",
u"нужна помощь:",
'`wiki.by_language("russian").inflight_translations += 1`',
]
2 changes: 1 addition & 1 deletion librarian/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def configure_client(config):
assignee_login=config["github"]["assignee_login"],
review_channel=config["discord"]["review_channel"],
review_role_id=config["discord"]["review_role_id"],
title_regex=config["github"]["title_regex"],
language_code=config["discord"]["language_code"],
store_in_pins=config["discord"]["store_in_pins"],
)

Expand Down
8 changes: 4 additions & 4 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ def titles():


@pytest.fixture
def regex():
return r"^\[(\w+.?)?RU(.+)?\]"
def language_code():
return "ru"


@pytest.fixture
Expand All @@ -135,11 +135,11 @@ def storage(dbpath):


@pytest.fixture
def client(mock_github, storage, repo, gh_token, regex, assignee_login):
def client(mock_github, storage, repo, gh_token, language_code, assignee_login):
bot = librarian.discord.Client(
github=librarian.github.GitHub(repo, gh_token),
storage=storage,
title_regex=regex,
language_code=language_code,
assignee_login=assignee_login,
)
bot.setup()
Expand Down
2 changes: 1 addition & 1 deletion tests/test_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def args_maker():
for _ in merged_only if
(
start <= arrow.get(_["merged_at"]) < end and
client.title_regex.match(_["title"])
client.language.title_regex.match(_["title"])
)
]
assert len(merged) == cnt, (", ".join(_["merged_at"] for _ in merged), start, end)
Expand Down

0 comments on commit 23e70c7

Please sign in to comment.