Arama¶
Mesaj araması, dizine eklenmiş mesajları bir metin sorgusu ve bir filtre kümesiyle eşleştirir. TEBHOS mesajları Elasticsearch'te dizinler. Üye araması Sunucu üyesi arama, sunucu araması ise Keşif sayfasında anlatılır.
İki yol vardır. Mesaj ara (POST /search/messages) kullanıcı oturumlarını ve bot token'larını kabul eder; tek bir kanalda, tek bir sunucuda veya çağıranın tüm sunucularında ve doğrudan mesajlarında arama yapabilir. Mesaj ara (sorgu dizesi) (GET /messages/search) ise yalnızca kullanıcılara açık, daha eski bir TEBHOS biçimidir.
Her sonuç, çağıranın okuyabildiği kanallarla sınırlıdır: bir sunucu kanalında çağıranın VIEW_CHANNEL ve READ_MESSAGE_HISTORY izinlerine sahip olması, bir özel kanalda ise alıcılardan biri olması gerekir. Gizli kanallardaki mesajlar sonuçlarda hiçbir zaman görünmez.
Mesaj ara¶
POST /search/messages
Dizine eklenmiş mesajlarda arama yapar ve bir genel arama sonucu nesnesi döndürür. Kullanıcı oturumlarını ve bot token'larını kabul eder; bot yalnızca current kapsamını kullanabilir.
Her isabet, döndürülmeden önce mesaj deposundan yeniden okunur. Mesajı artık mevcut olmayan bir isabet sayfadan çıkarılır ve dizinden silinir; bu nedenle bir sayfada hits_per_page değerinden daha az girdi bulunabilir.
JSON gövdesi¶
| Alan | Tür | Açıklama |
|---|---|---|
| scope? | string | Arama kapsamı, varsayılan current |
| context_channel_id? | snowflake | current kapsamında: aranacak kanal. DM kapsamlarında: her zaman dahil edilen, çağırana ait bir DM |
| context_guild_id? | snowflake | current kapsamında: aranacak sunucu (context_channel_id alanına göre önceliklidir) |
| channel_ids? | array[snowflake] | En fazla 500. Aramayı bu kanallarla daraltır; her biri çağıran tarafından okunabilir olmalı (403 MISSING_PERMISSIONS) ve context_guild_id ile birlikte kullanıldığında o sunucuya ait olmalıdır |
| content? | string | Mesaj içeriği ve gömme metniyle eşleştirilen serbest metin sorgusu (1-1,024 karakter) |
| contents? | array[string] | En fazla 100 sorgu; herhangi biriyle eşleşen mesaj döndürülür (content yerine geçer) |
| exact_phrases? | array[string] | Tümü bitişik olarak geçmesi gereken en fazla 10 ifade |
| hits_per_page? | integer | 1-25, varsayılan 25 |
| page? | integer | 1-400, varsayılan 1. cursor verildiğinde yok sayılır |
| cursor? | array[string] | 400. sayfanın ötesine geçmek için önceki sayfanın cursor değeri |
| max_id? / min_id? | snowflake | Yalnızca kimliği bu değerin altında / üstünde olan mesajlar |
| exclude_channel_id? | array[snowflake] | Dışarıda bırakılacak kanallar |
| author_id? / exclude_author_id? | array[snowflake] | Dahil edilecek / hariç tutulacak yazarlar (en fazla 100) |
| author_type? / exclude_author_type? | array[string] | user, bot veya webhook |
| mentions? | array[snowflake] | Tümünden bahsedilmesi gereken kullanıcılar |
| exclude_mentions? | array[snowflake] | Bahsedilmemesi gereken kullanıcılar |
| mention_everyone? | boolean | Mesajın @everyone bahsi içerip içermediği |
| pinned? | boolean | Mesajın sabitlenmiş olup olmadığı |
| has? / exclude_has? | array[string] | Tümü bulunması / bulunmaması gereken içerik türleri |
| embed_type? / exclude_embed_type? | array[string] | Gömme türleri: image, video, sound, article |
| embed_provider? / exclude_embed_provider? | array[string] | Gömme sağlayıcı adları |
| link_hostname? / exclude_link_hostname? | array[string] | Metindeki bağlantıların ana makine adları (küçük harfle karşılaştırılır) |
| attachment_filename? / exclude_attachment_filename? | array[string] | Tam ek dosya adları |
| attachment_extension? / exclude_attachment_extension? | array[string] | Nokta olmadan ek uzantıları |
| sort_by? | string | timestamp (varsayılan) veya relevance |
| sort_order? | string | desc (varsayılan) veya asc; timestamp için geçerlidir |
| include_nsfw? | boolean | Uyumluluk için kabul edilir. TEBHOS'ta yaş kısıtlamalı kanal olmadığından hiçbir şeyi değiştirmez |
Snowflake değerleri dize veya sayı olarak gönderilebilir. Aynı listedeki filtrelerin tümü eşleşmelidir (mentions, has, embed_type, link_hostname, attachment_filename, attachment_extension); yalnızca author_id ve author_type listelenen değerlerden herhangi biriyle eşleşir.
Dizine eklenen filtreler
author_type, mention_everyone, has: snapshot, gömme filtreleri ve gömme metni eşleştirmesi, TEBHOS'un arama dizinine eklediği alanları okur. Bu alanlar var olmadan önce dizinlenmiş mesajlar bunlarla ancak yeniden dizinlemeden sonra eşleşir. has: poll hiçbir şeyle eşleşmez, çünkü anketler dizinlenmez.
Yanıt¶
| Durum | Gövde | Koşul |
|---|---|---|
| 200 | genel arama sonucu nesnesi | Arama tamamlandı; eşleşme olmayabilir |
| 400 | hata yanıtı INVALID_FORM_BODY |
Bir alan aralık dışında veya hatalı biçimde; errors[].code değeri CONTEXT_CHANNEL_OR_GUILD_ID_REQUIRED (bağlam olmadan current kapsamı), BOT_SEARCH_SCOPE_UNAVAILABLE (bir bot başka bir kapsam kullandı) veya ALL_CHANNELS_MUST_BELONG_TO_GUILD olur |
| 403 | hata yanıtı | MISSING_PERMISSIONS: listelenen bir kanal okunamıyor. FORBIDDEN: bağlam kanalı görüntülenemiyor |
| 404 | hata yanıtı | Bağlam kanalı mevcut değil veya görünmüyor (NOT_FOUND) ya da çağıran bağlam sunucusunun üyesi değil (UNKNOWN_GUILD) |
| 503 | hata yanıtı FEATURE_TEMPORARILY_DISABLED |
Örnek (instance) için yapılandırılmış bir arama altyapısı yok |
Hız sınırı¶
search:messages kovasında (sorgu dizesi yoluyla paylaşılır) hesap başına 10 saniyede 20 istek.
Örnek¶
curl -X POST https://tebhos.com/api/v1/search/messages \
-H "Authorization: Bot $TEBHOS_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"context_guild_id": "1489002177550843904", "content": "release notes", "has": ["link"], "hits_per_page": 10}'
Genel arama kapsamları¶
| Değer | Nerede aranır |
|---|---|
| current | context_guild_id ile: o sunucunun okunabilir tüm kanalları (çağıran üye olmalıdır). Aksi hâlde context_channel_id kanalı; READ_MESSAGE_HISTORY olmadan yalnızca sunucunun geçmiş sınırından sonraki mesajlar döndürülür, sınır yoksa hiçbir şey döndürülmez |
| open_dms | Çağıranın açık olan doğrudan ve grup doğrudan mesajları |
| all_dms | Kapalı olanlar dahil, çağıranın tüm doğrudan ve grup doğrudan mesajları |
| all_guilds | Çağıranın üyesi olduğu tüm sunucuların okunabilir tüm kanalları |
| all | all_dms ve all_guilds birlikte |
| open_dms_and_all_guilds | open_dms ve all_guilds birlikte |
Genel arama sonucu nesnesi¶
| Alan | Tür | Açıklama |
|---|---|---|
| messages | array[mesaj nesnesi] | Bu sayfadaki eşleşen mesajlar; referenced_message olmadan |
| channels | array[kanal nesnesi] | Döndürülen mesajların ait olduğu kanallar |
| total | integer | Eşleşen mesaj sayısı; bu sayfada çıkarılan bayat isabetler kadar azaltılır. READ_MESSAGE_HISTORY olmadan aranan bir kanal için döndürülen mesaj sayısıdır |
| hits_per_page | integer | Kullanılan sayfa boyutu |
| page | integer | Döndürülen sayfa |
| cursor? | array[string] | Sonraki sayfayı almak için cursor olarak geri gönderin; sayfa boşsa bulunmaz |
Genel arama içerik türleri¶
| Değer | Açıklama |
|---|---|
| image | Görsel eki var |
| video | Video eki var |
| sound | Ses eki var |
| file | En az bir eki var |
| sticker | En az bir çıkartması var |
| embed | En az bir gömmesi var |
| link | Metninde bağlantı var |
| snapshot | İletilmiş bir mesaj |
| poll | Anketi var (TEBHOS'ta hiçbir zaman eşleşmez) |
Mesaj ara (sorgu dizesi)¶
GET /messages/search
Daha eski TEBHOS arama yolu. Yalnızca kullanıcılara açıktır: bot token'ı 403 ACCESS_DENIED ile reddedilir.
Dizine eklenmiş mesajlarda arama yapar ve bir mesaj arama sonucu nesnesi döndürür.
Her isabet, döndürülmeden önce mesaj deposundan yeniden okunur. Mesajı artık mevcut olmayan bir isabet sayfadan çıkarılır ve dizinden silinir; bu nedenle bir sayfada limit değerinden daha az girdi bulunabilir.
Sorgu parametreleri¶
| Alan | Tür | Açıklama |
|---|---|---|
| q | string | Mesaj içeriği ve yazarın görünen adıyla eşleştirilen serbest metin sorgusu. Zorunludur, ancak her mesajla eşleşmesi için boş olabilir |
| channel_id? | snowflake | Aranacak kanal. server_id onsuz verilmedikçe zorunludur (bkz. arama kapsamları) |
| server_id? | snowflake | Aranacak sunucu |
| scope? | string | channel (varsayılan) veya server; bkz. arama kapsamları |
| limit? | integer | Sayfa başına sonuç (en fazla 50, varsayılan 25) |
| page? | integer | 1'den başlayan sayfa numarası (varsayılan 1) |
| author_id? | snowflake | Yalnızca bu kullanıcının mesajları |
| exclude_author_id? | snowflake | Bu kullanıcının mesajlarını hariç tutar |
| mentions? | snowflake | Yalnızca bu kullanıcıdan bahseden mesajlar |
| pinned? | boolean | true yalnızca sabitlenmiş mesajları döndürür |
| has? | string | Tümü bulunması gereken, virgülle ayrılmış içerik türleri |
| exclude_has? | string | Tümü bulunmaması gereken, virgülle ayrılmış içerik türleri |
| link? | string | Yalnızca tam olarak bu ana makine adına bağlantı içeren mesajlar (küçük harfle karşılaştırılır) |
| filename? | string | Yalnızca tam olarak bu dosya adına sahip bir eki olan mesajlar |
| ext? | string | Yalnızca bu uzantıya sahip bir eki olan mesajlar (nokta olmadan, küçük harfle karşılaştırılır) |
| before? | string | Yalnızca bu yerel günden (YYYY-MM-DD) önce oluşturulan mesajlar |
| after? | string | Yalnızca bu yerel günden (YYYY-MM-DD) sonra, yani ertesi günün başından itibaren oluşturulan mesajlar |
| during? | string | Yalnızca bu yerel günde (YYYY-MM-DD) oluşturulan mesajlar |
| tz_offset? | integer | İstemcinin dakika cinsinden saat dilimi farkı; JavaScript getTimezoneOffset() tarafından döndürüldüğü şekliyle (ör. UTC+3 için -180). Gün filtrelerini UTC sınırlarına çevirmek için kullanılır. -840..840 aralığına sıkıştırılır, varsayılan 0 |
| sort? | string | Sıralama kipi (varsayılan newest) |
before, after veya during içindeki geçersiz bir tarih 400 BAD_REQUEST döndürür.
Yanıt¶
| Durum | Gövde | Koşul |
|---|---|---|
| 200 | mesaj arama sonucu nesnesi | Arama tamamlandı; eşleşme olmayabilir |
| 400 | hata yanıtı | Ne channel_id ne server_id verildi, q eksik ya da bir kimlik veya tarih hatalı biçimde (BAD_REQUEST) |
| 403 | hata yanıtı | Çağıran bir bot (ACCESS_DENIED), sunucunun üyesi değil veya kanalı görüntüleyemiyor (FORBIDDEN) |
| 404 | hata yanıtı | Kanal mevcut değil veya çağıran kanalı göremiyor (NOT_FOUND) |
| 500 | hata yanıtı | Örnek için yapılandırılmış bir arama altyapısı yok |
Hız sınırı¶
search:messages kovasında kullanıcı başına 10 saniyede 20 istek.
Örnek¶
curl -G "https://tebhos.com/api/v1/messages/search" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "q=release notes" \
--data-urlencode "channel_id=1489002177550843905" \
--data-urlencode "has=link,image" \
--data-urlencode "sort=newest"
Arama kapsamları¶
| Parametreler | Nerede aranır |
|---|---|
channel_id (kapsam belirtilmemiş veya channel) |
Yalnızca o kanal. Çağıranın VIEW_CHANNEL iznine ihtiyacı vardır. READ_MESSAGE_HISTORY olmadan yalnızca sunucunun mesaj geçmişi sınırından sonraki mesajlar döndürülür; sunucunun sınırı yoksa hiçbir şey döndürülmez |
channel_id + scope=server + server_id |
Sunucunun, çağıranın hem VIEW_CHANNEL hem READ_MESSAGE_HISTORY iznine sahip olduğu tüm kanalları. Çağıran sunucunun üyesi olmalıdır. Tüm filtreler uygulanır |
Yalnızca server_id |
Çağıranın okuyabildiği kanallarla sınırlı olarak sunucunun tamamı. Yalnızca q ve limit uygulanır; diğer filtreler ve page yok sayılır, yanıtta yalnızca items bulunur |
Doğrudan mesaj ve grup doğrudan mesaj kanallarında channel_id ile arama yapılır; çağıran alıcılardan biri olmalıdır.
Mesaj arama sonucu nesnesi¶
Yapı¶
| Alan | Tür | Açıklama |
|---|---|---|
| items | array[mesaj nesnesi] | Bu sayfadaki eşleşen mesajlar |
| total | integer | Eşleşen mesajların yaklaşık sayısı |
| page | integer | Döndürülen sayfa |
| total_pages | integer | ceil(total / limit); hiçbir şey eşleşmediyse 0 |
| next_cursor | ?string | Dize olarak sonraki sayfa numarası; son sayfada null |
total arama dizininden gelir ve geçerli sayfada çıkarılan bayat isabet sayısı kadar azaltılır; bu nedenle bir tahmindir. Sonuçlarda next_cursor null olana kadar page değerini artırarak sayfalayın.
Yalnızca server_id içeren biçim, sayfalama alanları olmadan {"items": [...]} döndürür.
Örnek¶
Arama içerik türleri¶
has ve exclude_has tarafından kabul edilen değerler. Bilinmeyen değerler yok sayılır.
| Değer | Açıklama |
|---|---|
| image | Görsel eki var |
| video | Video eki var |
| sound | Ses eki var |
| file | En az bir eki var |
| link | Metninde bağlantı var |
| embed | En az bir gömmesi var |
| sticker | En az bir çıkartması var |
Arama sıralama kipleri¶
| Değer | Açıklama |
|---|---|
| newest | En yeni önce (oluşturulma zamanına, ardından mesaj kimliğine göre) |
| oldest | En eski önce |
| relevance | q boş değilse altyapının varsayılan sıralamasını kullanır. Dizin her zaman azalan mesaj kimliği sıralaması eklediğinden pratikte bu da en yeni önce demektir. q boşsa newest kipine geri döner |