Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
altlinux-packages-bot
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kirill Unitsaev
altlinux-packages-bot
Commits
ebad2710
Verified
Commit
ebad2710
authored
Jul 17, 2025
by
Kirill Unitsaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add news handlers
parent
aadc20ed
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
165 additions
and
0 deletions
+165
-0
extra.py
src/extra.py
+18
-0
news.py
src/handlers/news.py
+35
-0
__init__.py
src/services/news/__init__.py
+3
-0
bugs.py
src/services/news/bugs.py
+59
-0
packages.py
src/services/news/packages.py
+50
-0
No files found.
src/extra.py
0 → 100644
View file @
ebad2710
import
asyncio
async
def
translate_async
(
text
):
process
=
await
asyncio
.
create_subprocess_exec
(
"trans"
,
"-b"
,
"-e"
,
"bing"
,
text
,
stdout
=
asyncio
.
subprocess
.
PIPE
,
stderr
=
asyncio
.
subprocess
.
PIPE
)
stdout
,
stderr
=
await
process
.
communicate
()
if
process
.
returncode
!=
0
:
raise
RuntimeError
(
f
"Translate error: {stderr.decode().strip()}"
)
return
stdout
.
decode
()
.
strip
()
def
chunk_list
(
lst
,
size
):
return
[
lst
[
i
:
i
+
size
]
for
i
in
range
(
0
,
len
(
lst
),
size
)]
src/handlers/news.py
0 → 100644
View file @
ebad2710
from
telegrinder
import
Dispatch
,
Message
from
telegrinder.rules
import
Command
,
Argument
from
altrepo
import
altrepo
from
services.news
import
format_packages
,
format_bugs
dp
=
Dispatch
()
@dp.message
(
Command
(
"news"
,
Argument
(
"news_type"
,
optional
=
True
),
Argument
(
"translate"
,
optional
=
True
)))
async
def
news_handler
(
m
:
Message
,
news_type
:
str
|
None
,
translate
:
str
|
None
)
->
None
:
news_type
=
news_type
or
"sisyphus"
if
news_type
==
"bugs"
:
bugs_data
=
await
altrepo
.
parser
.
news
.
bugs
()
if
not
bugs_data
:
await
m
.
answer
(
"Новостей пока нет."
)
return
bugs
=
await
format_bugs
(
bugs_data
)
await
m
.
answer
(
bugs
)
else
:
if
news_type
==
"sisyphus"
:
packages_data
=
await
altrepo
.
parser
.
news
.
sisyphus
()
elif
news_type
==
"p11"
:
packages_data
=
await
altrepo
.
parser
.
news
.
p11
()
if
not
packages_data
:
await
m
.
answer
(
"Новостей пока нет."
)
return
added
,
removed
,
updated
=
await
format_packages
(
packages_data
,
bool
(
translate
))
await
m
.
answer
(
f
"{added}{removed}"
)
for
msg
in
updated
:
res
=
await
m
.
answer
(
msg
)
src/services/news/__init__.py
0 → 100644
View file @
ebad2710
from
.packages
import
format_packages
from
.bugs
import
format_bugs
\ No newline at end of file
src/services/news/bugs.py
0 → 100644
View file @
ebad2710
from
telegrinder.tools.formatting
import
HTMLFormatter
,
link
,
bold
,
block_quote
from
altrepo.parser.models
import
BugsModel
,
BugsElementModel
from
config
import
BUGS_URL
,
PACKAGES_URL
repo
=
PACKAGES_URL
.
format
(
repo
=
"sisyphus"
)
async
def
format_bugs
(
bugs
:
BugsModel
):
bug_message
=
""
if
bugs
.
quickly_resolved
:
bug_message
+=
"Быстрозакрытые:
\n
"
for
bug
in
bugs
.
quickly_resolved
:
bug_message
+=
await
_format_bug
(
bug
)
if
bugs
.
new
:
bug_message
+=
"Новые:
\n
"
for
bug
in
bugs
.
new
:
bug_message
+=
await
_format_bug
(
bug
)
if
bugs
.
old
:
bug_message
+=
"Устаревшие:
\n
"
for
bug
in
bugs
.
old
:
bug_message
+=
await
_format_bug
(
bug
)
if
bugs
.
resolved
:
bug_message
+=
"Закрытые:
\n
"
for
bug
in
bugs
.
resolved
:
bug_message
+=
await
_format_bug
(
bug
)
if
bugs
.
reopened
:
bug_message
+=
"Переоткрытые:
\n
"
for
bug
in
bugs
.
reopened
:
bug_message
+=
await
_format_bug
(
bug
)
if
bugs
.
random
:
bug_message
+=
"Рандомные:
\n
"
for
bug
in
bugs
.
random
:
bug_message
+=
await
_format_bug
(
bug
)
bug_message
+=
"Сформировано при помощи "
+
HTMLFormatter
(
bold
(
link
(
"https://t.me/altlinux_packages_bot"
,
text
=
"ALT Packages Bot"
)))
return
bug_message
async
def
_format_bug
(
bug
:
BugsElementModel
):
message
=
HTMLFormatter
(
bold
(
link
(
f
"{BUGS_URL}{bug.id}"
,
text
=
f
"#{bug.id}"
)))
+
" | "
message
+=
HTMLFormatter
(
bold
(
link
(
f
"{repo}{bug.component}"
,
text
=
f
"{bug.component}"
)))
+
" | "
message
+=
f
"{bug.priority}"
message
+=
f
" | {bug.status}
\n
"
if
bug
.
status
else
"
\n
"
message
+=
f
"{bug.summary}
\n\n
"
return
message
src/services/news/packages.py
0 → 100644
View file @
ebad2710
from
telegrinder.tools.formatting
import
HTMLFormatter
,
link
,
bold
from
altrepo.parser.models
import
PackagesModel
,
PackageElementModel
,
RemovedPackageElementModel
from
config
import
PACKAGES_URL
from
extra
import
translate_async
,
chunk_list
repo
=
PACKAGES_URL
.
format
(
repo
=
"sisyphus"
)
async
def
format_packages
(
packages
:
PackagesModel
,
translate
:
bool
|
None
=
None
):
added_message
=
""
removed_message
=
""
updated_messages
=
[]
if
packages
.
added
:
added_message
+=
"Добавлены:
\n
"
for
package
in
packages
.
added
:
added_message
+=
await
_format_package
(
package
,
translate
)
if
packages
.
removed
:
removed_message
+=
"Удалены:
\n
"
for
package
in
packages
.
removed
:
removed_message
+=
await
_format_removed_package
(
package
)
if
packages
.
updated
:
for
packages
in
chunk_list
(
packages
.
updated
,
20
):
updated_message
=
"Обновлены:
\n
"
for
package
in
packages
:
updated_message
+=
await
_format_package
(
package
,
translate
)
updated_messages
.
append
(
updated_message
)
return
added_message
,
removed_message
,
updated_messages
async
def
_format_package
(
package
:
PackageElementModel
,
translate
:
bool
):
message
=
HTMLFormatter
(
bold
(
link
(
f
"{repo}srpms/{package.name}"
,
text
=
package
.
name
))
)
+
f
" - {(await translate_async(package.description)) if translate else package.description}
\n
"
message
+=
f
"{(await translate_async(package.maintainer_name)) if translate else package.maintainer_name} ({package.maintainer_nick})
\n\n
"
return
message
async
def
_format_removed_package
(
package
:
RemovedPackageElementModel
):
message
=
HTMLFormatter
(
bold
(
link
(
f
"{repo}srpms/{package.name}"
,
text
=
package
.
name
)))
+
"
\n\n
"
return
message
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment