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.
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.
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ə 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ış 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ı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ış 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,
)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çı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)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>",
)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)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,
)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>",
)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.
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.
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).
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.
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
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
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
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
eolymp_pages_get(id)
Məzmun səhifəsini id ilə gətirir. page qaytarır.
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 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.
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.
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.
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.
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ü |
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ü |
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 |
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 |
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ü |
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 |
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 |
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ü |
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn ( |
| mətn |
| mətn |
| mətn |
| vaxt möhürü |
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 |
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| mətn |
Sahə | Tip |
|---|---|
| mətn |
| mətn |
| mətn |
| mətn |
| bul |
| mətn siyahısı |