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.
# 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_name və started_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_start və range_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)size və offset səhifələməyə nəzarət edir. search, sort və order ("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 |
|---|---|
| bərabərdir (həmçinin standart) |
| bərabər deyil |
| böyükdür, böyük və ya bərabər |
| kiçikdir, kiçik və ya bərabər |
| alt sətri ehtiva edir |
| 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 |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn (qısa dil, məs. |
| mətn (tam runtime id-si) |
| mətn |
| mətn |
| ədəd |
| ədəd |
| ədəd |
| vaxt möhürü |
| vaxt möhürü |
contest submission
Yarış daxilində edilən göndərmə, eolymp_contests_get_submission və eolymp_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 |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn (qısa dil, məs. |
| mətn (tam runtime id-si) |
| mətn |
| mətn |
| ədəd |
| ədəd |
| ədəd |
| bul |
| vaxt möhürü |
member
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| ədəd |
| ədəd |
| bul |
| obyekt (atribut açarı → mətn və ya ədəd) |
| mətn |
| mətn |
| mətn |
| bul |
| mətn |
| mətn |
| mətn |
contest
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| ədəd (saniyə) |
| vaxt möhürü |
| vaxt möhürü |
| ədəd |
| ədəd |
| bul |
| bul |
participant
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| bul |
| bul |
| bul |
| bul |
| bul |
| vaxt möhürü |
| vaxt möhürü |
result
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| bul |
| bul |
| bul |
| mətn |
| ədəd |
| ədəd |
| ədəd |
| ədəd |
| ədəd |
score
Sahə | Tip |
|---|---|
| ədəd |
| ədəd |
| ədəd |
| bul |
| obyekt siyahısı (aşağıya baxın) |
breakdown-un hər elementində:
Sahə | Tip |
|---|---|
| mətn |
| bul |
| ədəd |
| ədəd |
| ədəd |
ticket
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| ədəd |
| vaxt möhürü |
| vaxt möhürü |
| vaxt möhürü |
reply
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn ( |
| mətn |
| mətn |
| mətn |
| vaxt möhürü |
problem
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| ədəd |
| mətn |
| mətn |
| mətn siyahısı |
| mətn siyahısı |
| ədəd |
| ədəd |
| ədəd |
| ədəd |
| ədəd |
| mətn |
| mətn |
| mətn |
| bul |
group
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
space
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
page
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| bul |
| mətn siyahısı |