Avtomatlaşdırma Skriptləri

Bir skript iki avtomatlaşdırma əməl növündən biridir. Qayda işə düşəndə onun skripti onu tətikləyən hadisə haqqında məlumatla bir dəfə işləyir. Skriptlər sabit, proqnozlaşdırıla bilən addımlar üçün ən yaxşısıdır — nailiyyət vermək, üzvü qrupa köçürmək, medal təyin etmək — hər dəfə eyni şəkildə işləməli olan.

Dil

Skriptlər Python-un kiçik, determinist dialekti olan Starlark-da yazılır. Bir az Python bilirsinizsə, o, tanış görünəcək: dəyişənlər, if/elif/else, for dövrləri, siyahılar, lüğətlər və funksiya çağırışları eyni şəkildə işləyir. Dilin tam təsviri üçün Starlark spesifikasiyasına baxın.

Starlark qəsdən məhduddur. Skript faylları oxuya, şəbəkə sorğuları göndərə və ya paketlər idxal edə bilməz — o, yalnız hadisəyə baxa və bu səhifədə sadalanan funksiyaları çağıra bilər. Bir neçə praktiki limit də tətbiq olunur:

  • Skript ən çoxu 10 saniyə işləyə bilər.

  • Skript ən çoxu 10 000 addım icra edə bilər.

Skript limitə çatarsa və ya xəta yaradarsa, dayanır və xəta qaydanın jurnalına yazılır.

Tətikləyicilər

Qaydanın dəqiq bir tətikləyicisi var — skriptini işə salan hadisə. Bu bölmə hər tətikləyicini, nə üçün faydalı olduğunu, skriptin aldığı dəyişənləri və qısa nümunəni təsvir edir.

Hər dəyişən sahələrini nöqtə ilə oxuduğunuz obyektdir (məsələn, submission.verdict); onun sahələrini görmək üçün dəyişəndəki keçidə keçin. Üç dəyişən həmişə mövcuddur, ona görə də aşağıda təkrarlanmır: space (space), event_name (hadisənin qısa təsviri) və trigger_name (tətikləyici). Əlaqəli obyektlər axtarıla bildikdə daxil edilir. Nümunələrdə istifadə olunan funksiyalar Functions bölməsində təsvir olunub.

Göndərmə tamamlandı

Göndərmə yoxlanışı bitib verdikt alanda işə düşür. Ondan fərdi həllərə reaksiya vermək üçün istifadə edin — ilk qəbul edilən göndərməyə görə nailiyyət vermək, çətin məsələni həll edən üzvü işarələmək və ya cəhdlərin sayını aparmaq.

Dəyişənlər: submission

# Grant an achievement for an accepted submission, once per problem
if submission.verdict == "ACCEPTED":
    eolymp_achievements_assign(
        member_id = submission.member_id,
        achievement_id = "<achievement-id>",
        reference = submission.problem_id,
    )
    printf("achievement granted to %s", submission.member_id)

Yarış göndərməsi tamamlandı

Yarış daxilində edilən göndərmənin yoxlanışı bitəndə işə düşür. Göndərmə tamamlandı kimidir, lakin yarışla məhdudlaşır — o, yarışı və iştirakçını daşıyır və onun göndərməsi yarış göndərməsi-dir. Ondan xüsusi olaraq yarış həllərinə reaksiya vermək üçün istifadə edin.

Dəyişənlər: submission, contest, participant, member

# Grant an achievement when a contest submission is accepted
if submission.verdict == "ACCEPTED":
    eolymp_achievements_assign(
        member_id = member.id,
        achievement_id = "<achievement-id>",
        reference = submission.problem_id,
    )

Yarış yekunlaşdırıldı

Yarış yekunlaşdırıldıqdan sonra işə düşür. Yarış artıq donduğu üçün bu tətikləyicidən başa çatmış yarışa reaksiya vermək üçün istifadə edin — iştirak nailiyyətləri vermək, sonrakı emalı başlatmaq və ya nəticələrin hazır olduğunu elan etmək. Yarışı və ya onun iştirakçılarını dəyişmək üçün yekunlaşdırmadan əvvəl Yarış əməli tətikləyicisindən istifadə edin.

Dəyişənlər: contest

# Grant a participation achievement to everyone in the contest
total, participants = eolymp_participants_list(contest_id = contest.id, size = 500)
for p in participants:
    if not p.ghost:
        eolymp_achievements_assign(
            member_id = p.member_id,
            achievement_id = "<participation-achievement-id>",
            reference = contest.id,  # once per contest
        )

Yarış balı dəyişdi

Yarış zamanı iştirakçının balı dəyişəndə işə düşür. Ondan yarış gedişində reaksiya vermək üçün istifadə edin — kimsə bütün məsələləri həll etdiyi anda nişan vermək və ya hədəf balı gözləmək.

Dəyişənlər: score, contest, participant, member

# Award a badge when a participant solves every problem
if contest.problem_count > 0 and score.solved == contest.problem_count:
    eolymp_achievements_assign(
        member_id = member.id,
        achievement_id = "<all-solved-achievement-id>",
        reference = contest.id,
    )

İştirakçı qeydiyyatdan keçdi

Kimsə yarışda iştirakçı kimi qeydiyyatdan keçəndə işə düşür. Ondan yeni qeydiyyatdan keçənləri hazırlamaq üçün istifadə edin — xoş gəldin mesajı göndərmək, başlanğıc qrupu təyin etmək və ya müəyyən qrupa əlavə vaxt vermək.

Dəyişənlər: participant, contest, member

# Add every new entrant to a group
eolymp_members_add_group(
    member_id = member.id,
    group_id = "<contestants-group-id>",
)
printf("%s registered for %s", participant.display_name, contest.name)

İştirakçı yekunlaşdırıldı

İştirakçının yarışdakı nəticəsi yekunlaşdırıldıqdan sonra işə düşür. Nəticə artıq donduğu üçün bu tətikləyicidən yekun sıralamaya reaksiya vermək üçün istifadə edin — yüksək yerə görə nailiyyət vermək, nəticəni haradasa qeyd etmək və ya iştirakçıya bildiriş göndərmək. İştirakçını dəyişmək (medal təyin etmək, onu rəsmi və ya qeyri-rəsmi işarələmək, əlavə vaxt vermək) yekunlaşdırılmış nəticəyə təsir etməyəcək — bunun əvəzinə bunu yekunlaşdırmadan əvvəl Yarış əməli tətikləyicisi ilə edin.

Dəyişənlər: participant, result, contest, member

# Grant an achievement for a top-three finish
if result.rank <= 3 and not result.unofficial:
    eolymp_achievements_assign(
        member_id = result.member_id,
        achievement_id = "<achievement-id>",
    )
    printf("top-3 achievement granted to %s", result.name)

Üzv dəyişdi

Məkanınıza üzv qoşulanda və ya mövcud üzv sonradan dəyişdirildikdə işə düşür. member üzvün cari vəziyyətidir; previous isə dəyişiklikdən əvvəlki vəziyyətidir. previous yalnız yeniləmələr üçün daxil edilir — üzv təzəcə qoşulduqda təqdim olunmur, qayda yeni üzvü dəyişdirilmiş üzvdən məhz bununla fərqləndirir. Ondan yeni üzvləri qəbul etmək və ya profil dəyişikliklərinə reaksiya vermək üçün istifadə edin.

Dəyişənlər: member, previous

# Route new members into a group based on their grade attribute
if member.attributes.grade > 9:
    eolymp_members_add_group(
        member_id = member.id,
        group_id = "<senior-group-id>",
    )
else:
    eolymp_members_add_group(
        member_id = member.id,
        group_id = "<junior-group-id>",
    )

Sual yaradıldı və ya cavablandırıldı

Yarışda sual verildikdə və ya cavablandırıldıqda işə düşür. Ondan dəstəyə kömək etmək üçün istifadə edin — yeni sualları işarələmək, işçiləri xəbərdar etmək və ya mövzuya görə bölüşdürmək. reply dəyişəni yalnız hadisə cavab olduqda mövcud olur. (Skriptlər sualları oxuya bilər, lakin onlara cavab verə bilməz; avtomatik cavab vermək üçün süni intellekt agenti əməlindən istifadə edin.)

Dəyişənlər: ticket, reply, contest, member

# Log newly created questions
if ticket.reply_count == 0:
    printf("new question from %s: %s", member.display_name, ticket.subject)

Yarış əməli

Qaydanın yanındakı Tətiklə düyməsindən istifadə edərək konkret yarış üzərində tələb olduqda işə saldığınız manual tətikləyici. Bu, yarışın iştirakçılarını tənzimləmək üçün doğru yerdir — qeydləri rəsmi və ya qeyri-rəsmi işarələmək, əlavə vaxt vermək və ya iştirakçıya medal təyin etmək — adətən yarışı yekunlaşdırmadan əvvəl. Bu, həmçinin birdəfəlik işlər üçün və qaydaya güvənməzdən əvvəl onu yoxlamaq üçün əlverişlidir.

Dəyişənlər: contest

# Make every unofficial entry official, before finalizing the contest
total, participants = eolymp_participants_list(contest_id = contest.id, size = 500)
for p in participants:
    if p.unofficial:
        eolymp_participants_set_official(
            contest_id = contest.id,
            participant_id = p.id,
            official = True,
        )

Üzv əməli

Konkret üzv üzərində tələb olduqda işə saldığınız manual tətikləyici. Ondan birdəfəlik üzv işləri və sınaq üçün istifadə edin.

Dəyişənlər: member

# Grant an achievement to the selected member
eolymp_achievements_assign(
    member_id = member.id,
    achievement_id = "<achievement-id>",
)

Functions

Funksiyaları açar sözlü arqumentlərlə çağırın, məsələn eolymp_members_add_group(member_id = "...", group_id = "..."). <optional> işarələnmiş arqumentlər buraxıla bilər. Məlumat oxuyan funksiyalar dəyər qaytarır; məlumatı dəyişən funksiyalar heç nə qaytarmır.

Nailiyyətlər

eolymp_achievements_assign(member_id, achievement_id, qty=<optional>, inc_by=<optional>, reference=<optional>)

Üzvə nailiyyət verir. Standart olaraq üzvün sayı 1-ə təyin edilir. Sayı dəqiq ədədə təyin etmək üçün qty, və ya onu müəyyən qədər artırmaq üçün inc_by ötürün. reference istəyə bağlı açardır: eyni referansı istifadə edən təkrar icralar həmin açar üçün yalnız bir dəfə tətbiq olunur — eyni şeyə görə iki dəfə verməmək üçün əlverişlidir.

Üzvlər

eolymp_members_get(id)

Üzvü id ilə gətirir. member qaytarır.

eolymp_members_list(filters=<optional>, search=<optional>, size=<optional>, offset=<optional>, sort=<optional>, order=<optional>)

Məkandakı üzvləri sadalayır. Ümumi sayı və member obyektlərinin siyahısını qaytarır — Listing and filters bölməsinə baxın.

Filtr sahələri: id, external_ref, type, display_name, inactive, incomplete, unofficial, seated, team_id, group_id, user_issuer, user_subject, user_email, user_name, user_nickname, birthday, country, score, attribute

eolymp_members_set_attributes(member_id, attributes)

Profil atributlarını üzvə birləşdirir. attributes atribut açarlarının mətn və ya ədədlərə uyğunlaşdırıldığı lüğətdir; sadalamadığınız açarlar dəyişməz qalır.

eolymp_members_set_preferences(member_id, locale=<optional>, timezone=<optional>, runtime=<optional>)

Üzvün seçimlərini yeniləyir. Yalnız ötürdüyünüz sahələr dəyişdirilir. runtime üzvün həllər üçün standart dilidir.

eolymp_members_add_group(member_id, group_id)

Üzvü qrupa əlavə edir.

eolymp_members_remove_group(member_id, group_id)

Üzvü qrupdan çıxarır.

eolymp_members_set_active(member_id, active)

Üzvü aktivləşdirir (active = True) və ya söndürür (active = False).

İştirakçılar

eolymp_participants_get(contest_id, participant_id)

Yarışdakı iştirakçını gətirir. participant qaytarır.

eolymp_participants_list(contest_id, filters=<optional>, search=<optional>, size=<optional>, offset=<optional>, sort=<optional>, order=<optional>)

Yarışın iştirakçılarını sadalayır. Ümumi sayı və participant obyektlərinin siyahısını qaytarır. Çeşidləmə display_namestarted_at ilə məhdudlaşır; bal və ya sıra üzrə çeşidləmə yoxdur.

Filtr sahələri: id, member_id, group_id, status, started_at, unofficial, disqualified, inactive, role, staff, has_violations

eolymp_participants_set_official(contest_id, participant_id, official)

İştirakçını rəsmi (official = True) və ya qeyri-rəsmi (official = False) işarələyir.

eolymp_participants_set_medal(contest_id, participant_id, medal)

İştirakçının medalını təyin edir. medal "gold", "silver", "bronze", "honorable_mention" və ya "none" dəyərlərindən biridir.

eolymp_participants_set_extra_time(contest_id, participant_id, seconds)

İştirakçıya əlavə (bonus) vaxt verir, saniyə ilə.

eolymp_participants_set_active(contest_id, participant_id, active)

İştirakçını aktivləşdirir (active = True) və ya söndürür (active = False).

eolymp_participants_disqualify(contest_id, participant_id, requalify=<optional>, reason=<optional>)

İştirakçını diskvalifikasiya edir; onu geri qaytarmaq üçün requalify = True ötürün. reason istəyə bağlı izahedici mətndir.

Bu funksiyalar yarışın iştirakçılarını dəyişir və ən yaxşısı yarış yekunlaşdırılmadan əvvəl Yarış əməli qaydasından işə salınır.

Yarışlar

eolymp_contests_get(id)

Yarışı id ilə gətirir. contest qaytarır.

eolymp_contests_list(filters=<optional>, search=<optional>, size=<optional>, offset=<optional>)

Məkandakı yarışları sadalayır. Ümumi sayı və contest obyektlərinin siyahısını qaytarır.

Filtr sahələri: id, name, starts_at, ends_at, public, visibility, format, status, featured, year, scale, series, difficulty, country, region, city, member_id

eolymp_contests_get_submission(contest_id, id)

Yarış daxilində edilən göndərməni gətirir. yarış göndərməsi qaytarır.

eolymp_contests_list_submissions(contest_id, filters=<optional>, after=<optional>, size=<optional>, offset=<optional>)

Yarışın göndərmələrini sadalayır. Ümumi sayı və yarış göndərməsi obyektlərinin siyahısını qaytarır.

Filtr sahələri: id, participant_id, problem_id, status, runtime, score, percentage, submitted_at, signature, verdict

Məsələlər

eolymp_problems_get(id)

Məsələni id ilə gətirir. problem qaytarır.

eolymp_problems_list(filters=<optional>, search=<optional>, size=<optional>, offset=<optional>, sort=<optional>, order=<optional>)

Məkandakı məsələləri sadalayır. Ümumi sayı və problem obyektlərinin siyahısını qaytarır.

Filtr sahələri: id, topic_id, is_visible, is_private, number, difficulty, status, score, is_bookmarked

Göndərmələr

eolymp_submissions_get(id)

Göndərməni id ilə gətirir. submission qaytarır.

eolymp_submissions_list(filters=<optional>, after=<optional>, size=<optional>, offset=<optional>)

Məkandakı göndərmələri sadalayır. Ümumi sayı və submission obyektlərinin siyahısını qaytarır.

Filtr sahələri: id, problem_id, user_id, member_id, submitted_at, runtime, status, verdict, score, percentage

eolymp_submissions_aggregate(group_by=<optional>, filters=<optional>, metric=<optional>, range_start=<optional>, range_end=<optional>)

Göndərmələri qruplara ümumiləşdirir. group_by qruplaşdırmaq üçün bir və ya bir neçə ölçüdür — "SUBMITTED_AT", "VERDICT", "STATUS" (bir neçəsi üçün siyahı ötürün). metric hər qrup üçün nəyin hesablanacağıdır; hazırda yalnız "COUNT" (standart). range_startrange_end nəzərə alınan göndərmələri məhdudlaşdıran RFC 3339 vaxt möhürləridir; buraxılarsa, yalnız son 30 gün sayılır. Qrupların siyahısını qaytarır, hər biri dimensions (həmin qrup üçün qruplaşdırma dəyərləri) və count olan obyektdir.

Filtr sahələri: problem_id, member_id, user_id, verdict, runtime, status, score, percentage

Qruplar

eolymp_groups_get(id)

Qrupu id ilə gətirir. group qaytarır.

eolymp_groups_list(filters=<optional>, size=<optional>, offset=<optional>)

Məkandakı qrupları sadalayır. Ümumi sayı və group obyektlərinin siyahısını qaytarır.

Filtr sahələri: id, external_ref, name, query

Səhifələr

eolymp_pages_get(id)

Məzmun səhifəsini id ilə gətirir. page qaytarır.

Vaxt

Yükdəki vaxt möhürləri RFC 3339 sətirləridir və Starlark-ın saat və ya müddət tipi yoxdur — bu köməkçilər qaydaya vaxt haqqında mühakimə yürütməyə imkan verir (məsələn, "son tarixdən beş dəqiqə ərzində").

time_diff(a, b)

a − b-ni saniyə ilə (tam ədəd) qaytarır, a b-dən əvvəldirsə mənfi olur. Hər iki arqument RFC 3339 vaxt möhürü sətirləridir.

time_shift(timestamp, seconds)

timestamp-ı verilmiş saniyə qədər sürüşdürür (geri getmək üçün mənfi) və nəticəni RFC 3339 sətri kimi qaytarır.

Jurnala yazma

Jurnala yazma skriptin nə etdiyini izləməyə imkan verir; nəticə qaydanın jurnallarında görünür.

printf(format, *args)

Mesajı formatlayır və onu jurnala əlavə edir. Mətn üçün %s, tam ədədlər üçün %d və istənilən dəyər üçün %v istifadə edin.

print(*args)

Sadə mesajı jurnala əlavə edir.

Listing and filters

Hər ..._list funksiyası iki dəyər qaytarır: uyğun gələn elementlərin ümumi sayı və cari səhifədəki elementlərin siyahısı. Onları birlikdə açın:

total, members = eolymp_members_list(size = 5)
printf("space has %d members", total)
for m in members:
    printf("- %s", m.display_name)

sizeoffset səhifələməyə nəzarət edir. search, sortorder ("asc" və ya "desc") dəstəkləndiyi yerlərdə mövcuddur.

Filtrlər sahə adına görə açarlanan lüğət kimi ötürülür. Hər sahə operator və dəyərə uyğunlaşdırılır; təkbaşına dəyər bərabərliyin qısaltmasıdır. Aşağıdakı sahə adları nümunə xarakterlidir; hər siyahının öz filtrlənə bilən sahələri yuxarıda onun funksiyası ilə birlikdə qeyd olunub.

{"verdict": "ACCEPTED"}                         # equals
{"level": {"gte": 5}}                           # greater than or equal
{"display_name": {"contains": "team"}}          # substring match
{"created_at": {"gt": "2026-01-01T00:00:00Z"}}  # after a date (RFC 3339)

Mövcud operatorlar:

Operator

Məna

eq

bərabərdir (həmçinin standart)

ne / neq

bərabər deyil

gt, ge / gte

böyükdür, böyük və ya bərabər

lt, le / lte

kiçikdir, kiçik və ya bərabər

contains

alt sətri ehtiva edir

starts / prefix

ilə başlayır

Dəyərlər mətn, tam ədədlər, True/False və ya "2026-01-01T00:00:00Z" kimi RFC 3339 vaxt möhürü sətri ola bilər.

Sınaq icrası

Qayda sınaq icrası kimi işlədikdə, yalnız oxumaq funksiyaları (..._get, ..._list) həmişəki kimi işləyir, lakin məlumatı dəyişəcək ilk funksiya icra edilmədən jurnala qeyd olunur və skript sonra dayanır. Skriptin həqiqətən hərəkət etməsinə icazə verməzdən əvvəl onun nə edəcəyini yoxlamaq üçün sınaq icrasından istifadə edin.

Obyektlər

Funksiyanın qaytardığı və ya tətikləyici dəyişəni kimi ötürülən hər obyektdəki sahələr. Sahəni nöqtə ilə oxuyun, məs. submission.verdict.

submission

Sahə

Tip

id

mətn

problem_id

mətn

user_id

mətn

member_id

mətn

lang

mətn (qısa dil, məs. cpp)

runtime

mətn (tam runtime id-si)

status

mətn

verdict

mətn

score

ədəd

cost

ədəd

percentage

ədəd

submitted_at

vaxt möhürü

judged_at

vaxt möhürü

contest submission

Yarış daxilində edilən göndərmə, eolymp_contests_get_submissioneolymp_contests_list_submissions tərəfindən qaytarılır. Onun problem_id-si yarışın məsələsidir (arxiv məsələsi deyil) və o, həmçinin yarışı və iştirakçını daşıyır.

Sahə

Tip

id

mətn

contest_id

mətn

problem_id

mətn

participant_id

mətn

lang

mətn (qısa dil, məs. cpp)

runtime

mətn (tam runtime id-si)

status

mətn

verdict

mətn

score

ədəd

cost

ədəd

percentage

ədəd

deleted

bul

submitted_at

vaxt möhürü

member

Sahə

Tip

id

mətn

external_ref

mətn

display_name

mətn

rank

mətn

rating

ədəd

level

ədəd

inactive

bul

attributes

obyekt (atribut açarı → mətn və ya ədəd)

user_name

mətn

user_nickname

mətn

user_email

mətn

user_email_verified

bul

user_picture

mətn

user_city

mətn

user_country

mətn

contest

Sahə

Tip

id

mətn

key

mətn

slug

mətn

name

mətn

url

mətn

image_url

mətn

format

mətn

series

mətn

status

mətn

visibility

mətn

participation_mode

mətn

duration

ədəd (saniyə)

starts_at

vaxt möhürü

ends_at

vaxt möhürü

problem_count

ədəd

participant_count

ədəd

allow_upsolve

bul

require_admission

bul

participant

Sahə

Tip

id

mətn

member_id

mətn

display_name

mətn

role

mətn

status

mətn

unofficial

bul

ghost

bul

inactive

bul

disqualified

bul

finalized

bul

started_at

vaxt möhürü

end_at

vaxt möhürü

result

Sahə

Tip

participant_id

mətn

member_id

mətn

contest_id

mətn

name

mətn

unofficial

bul

disqualified

bul

ghost

bul

medal

mətn

rank

ədəd

rank_lower

ədəd

score

ədəd

penalty

ədəd

solved

ədəd

score

Sahə

Tip

score

ədəd

penalty

ədəd

solved

ədəd

upsolve

bul

breakdown

obyekt siyahısı (aşağıya baxın)

breakdown-un hər elementində:

Sahə

Tip

problem_id

mətn

solved

bul

score

ədəd

percentage

ədəd

attempts

ədəd

ticket

Sahə

Tip

id

mətn

contest_id

mətn

member_id

mətn

participant_id

mətn

subject

mətn

message

mətn

status

mətn

reply_count

ədəd

created_at

vaxt möhürü

updated_at

vaxt möhürü

last_reply_at

vaxt möhürü

reply

Sahə

Tip

id

mətn

ticket_id

mətn

author

mətn (participant və ya jury)

member_id

mətn

user_id

mətn

message

mətn

created_at

vaxt möhürü

problem

Sahə

Tip

id

mətn

url

mətn

type

mətn

number

ədəd

title

mətn

language

mətn

languages

mətn siyahısı

topics

mətn siyahısı

difficulty

ədəd

score

ədəd

acceptance_rate

ədəd

submissions_count

ədəd

submissions_accepted

ədəd

author

mətn

source

mətn

origin

mətn

visible

bul

group

Sahə

Tip

id

mətn

name

mətn

description

mətn

external_ref

mətn

icon

mətn

badge

mətn

color

mətn

space

Sahə

Tip

id

mətn

key

mətn

name

mətn

url

mətn

status

mətn

page

Sahə

Tip

id

mətn

path

mətn

locale

mətn

title

mətn

draft

bul

labels

mətn siyahısı