# Mesajlar

Mesajlar için REST API rotaları.

## Mesajları listele (`listMessages`)

**`GET https://noluyo.net/api/v1/channels/{channel_id}/messages`** (`GET /channels/{channel_id}/messages`)

Mesajları en yeniden eskiye döndürür: son sayfayı ya da bir mesajın öncesini, sonrasını veya çevresini. before ile after birlikte, around da bunlardan biriyle kullanılamaz. ReadMessageHistory yoksa yanıt hata değil, boş listedir. Çağıranın tepkileri reactions[].me ile işaretlenir. Sunucu kanalında, içerik intent'i olmayan bir bot başkalarının mesajlarını içeriği çıkarılmış olarak alır; botu etiketleyenler hariç.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `ReadMessageHistory`
- **Hız sınırı:** `read` (30 / 5s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `channel_id` | `path` | `string` | evet | Kanal ID'si. |
| `limit` | `query` | `integer` | - | Kaç mesaj döneceği. (1–100 · = 50) |
| `before` | `query` | `ID` | - | Bu ID'den eski mesajlar. |
| `after` | `query` | `ID` | - | Bu ID'den yeni mesajlar. Ona en yakın olanlar döner, sıra yine en yeniden eskiyedir. |
| `around` | `query` | `ID` | - | Bu ID'nin çevresindeki mesajlar: kendisi ve yenileri sayfanın büyük yarısını doldurur. |

### Örnek çağrılar

```bash
curl "https://noluyo.net/api/v1/channels/111500000000000100/messages?limit=50" \
  -H "Authorization: Bot $BOT_TOKEN"
```

```js
// JavaScript (noluyo-bot)
await bot.rest.listMessages("111500000000000100", { limit: 50 });
```

```py
# Python (noluyo_bot)
await bot.rest.list_messages("111500000000000100", {"limit": 50})
```

### Yanıt (200)

```json
[
  {
    "id": "111600000000000000",
    "type": 0,
    "channel_id": "111500000000000100",
    "guild_id": "111500000000000000",
    "author": {
      "id": "111540000000000001",
      "username": "ornek_bot",
      "display_name": "Örnek Bot",
      "avatar": null,
      "cosmetics": null,
      "bot": true
    },
    "content": "Merhaba!",
    "timestamp": "2026-11-04T22:58:33.427Z",
    "edited_timestamp": null,
    "attachments": [],
    "mentions": [],
    "mention_roles": [],
    "mention_everyone": false,
    "pinned": false
  }
]
```

### Hata kodları

- **HTTP 400:** `validation_failed`, `invalid_channel_type`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `missing_access`, `temporarily_banned`
- **HTTP 404:** `unknown_channel`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Mesaj gönder (`createMessage`)

**`POST https://noluyo.net/api/v1/channels/{channel_id}/messages`** (`POST /channels/{channel_id}/messages`)

Metin kanalına mesaj gönderir ve mesajla birlikte 200 döner. content en çok 2000 karakterdir; mesajda dosya, iletme, anket veya çıkartma yoksa zorunludur. Dosya göndermek için multipart/form-data kullan: JSON payload_json adlı parçada, en çok on dosya files[0], files[1] gibi adlandırılmış parçalarda olur; bunun için AttachFiles gerekir. message_reference mesajı yanıta çevirir (ReadMessageHistory); allowed_mentions.replied_user false, yanıtın kişiyi etiketlemesini önler. En çok 64 karakterlik nonce yalnızca bu yanıtta geri gelir. Bir mesajda anket, iletme ve çıkartmadan yalnızca biri olabilir; hiçbiri dosyayla birlikte gönderilemez. Sunucunun otomatik moderasyonu mesajı automod_blocked, kanalın yavaş modu slowmode ile reddedebilir. Botlar mesaja embed (en çok 10 kart) ve bileşen (buton ve menü, en çok 5 satır) ekleyebilir; nasıl yapıldığını embed rehberi anlatır. Embed görselleri mesajla gönderilen dosyalardır, başka bir adres olamaz. flags 64 (ephemeral) ephemeral_forbidden döner. Embed ve bileşenler ayrıca, boyutları sunucunun üye sayısıyla çarpılarak x-rate-limits içindeki fanout tavanına sayılır: X-RateLimit-Scope bot ile gelen 429 sahibinin payı ya da bekleme süresidir, shared ile gelen 429 tüm botların ortak tavanıdır ve botun suçu değildir; max_bytes ile gelen 400 fanout_too_large, mesajın o kanal için fazla büyük olduğunu söyler. Bir kişinin botunla açtığı DM'de kendiliğinden ancak kişinin son mesajı, komutu ya da basmasından sonraki 24 saat içinde yazabilirsin (dm_window_closed); kişi DM'yi kapattıysa ya da botu engellediyse hiç yazamazsın (dm_closed); tüm DM'lerinde toplam dm_send sınırı geçerlidir. Ayrıntılar özel mesajlar rehberinde.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `SendMessages`, `AttachFiles`, `ReadMessageHistory`, `MentionEveryone`, `UseExternalStickers`
- **Hız sınırı:** `message` (5 / 5s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `channel_id` | `path` | `string` | evet | Kanal ID'si. |

### Gövde alanları

| Alan | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `content` | `string` | - | (<= 2000) |
| `nonce` | `string` | - | Daha uzunu hata vermeden atılır. (<= 64) |
| `message_reference` | `object` | - |  |
| `message_reference.message_id` | `ID` | evet | 64 bitlik ID; yanıtta da istekte de her zaman metin olarak yazılır. ID'ler oluşturulma zamanına göre sıralanır. |
| `allowed_mentions` | `object` | - |  |
| `allowed_mentions.replied_user` | `boolean` | - |  |
| `allowed_mentions.parse` | `string[]` | - | Yalnızca botlar için. Metindeki hangi etiket türlerinin bildirim göndereceği. parse, users veya roles gönderilirse yalnızca listelenenler bildirim gönderir; varsayılan için üçünü de yazma. |
| `allowed_mentions.users` | `ID[]` | - | Yalnızca botlar için. parse içinde users yokken de bildirim gönderen kullanıcılar. parse içindeki users ile birlikte yazılamaz. En çok 100. (<= 100) |
| `allowed_mentions.roles` | `ID[]` | - | Yalnızca botlar için. parse içinde roles yokken de bildirim gönderen roller. parse içindeki roles ile birlikte yazılamaz. En çok 100. (<= 100) |
| `forward` | `object` | - |  |
| `forward.channel_id` | `ID` | evet | 64 bitlik ID; yanıtta da istekte de her zaman metin olarak yazılır. ID'ler oluşturulma zamanına göre sıralanır. |
| `forward.message_id` | `ID` | evet | 64 bitlik ID; yanıtta da istekte de her zaman metin olarak yazılır. ID'ler oluşturulma zamanına göre sıralanır. |
| `poll` | `object` | - |  |
| `poll.question` | `string` | evet | (1–300) |
| `poll.answers` | `string[]` | evet | (2–10) |
| `poll.allow_multiselect` | `boolean` | - |  |
| `poll.duration` | `integer` | - | Saat. (1, 4, 8, 24, 72, 168 · = 24) |
| `sticker_ids` | `ID[]` | - | (<= 1) |
| `embeds` | `Embed[]` | - | Yalnızca botlar için; kişi gönderirse validation_failed alır. Embed'li mesajda content gerekmez. Görseller aynı mesajla gönderilen dosyalardan gelir (attachment://); başka bir adres reddedilir. (<= 10) |
| `components` | `MessageComponent[]` | - | Yalnızca botlar için. Yalnızca bileşenli mesaj reddedilir: content, embed veya dosya gerekir. (<= 5) |
| `flags` | `integer` | - | Yalnızca botlar için. Boş bırak: 64 (ephemeral) ephemeral_forbidden döner çünkü kanal mesajının gösterileceği tek bir kişi yoktur; başka her bit invalid olur. |

### Örnek çağrılar

```bash
curl -X POST "https://noluyo.net/api/v1/channels/111500000000000100/messages" \
  -H "Authorization: Bot $BOT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"content":"Merhaba!"}'
```

```js
// JavaScript (noluyo-bot)
await bot.rest.createMessage("111500000000000100", { content: "Merhaba!" });
```

```py
# Python (noluyo_bot)
await bot.rest.create_message("111500000000000100", {"content": "Merhaba!"})
```

### Yanıt (200)

```json
{
  "id": "111600000000000000",
  "type": 0,
  "channel_id": "111500000000000100",
  "guild_id": "111500000000000000",
  "author": {
    "id": "111540000000000001",
    "username": "ornek_bot",
    "display_name": "Örnek Bot",
    "avatar": null,
    "cosmetics": null,
    "bot": true
  },
  "content": "Merhaba!",
  "timestamp": "2026-11-04T22:58:33.427Z",
  "edited_timestamp": null,
  "attachments": [],
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "pinned": false,
  "nonce": "istek-1"
}
```

### Hata kodları

- **HTTP 400:** `validation_failed`, `invalid_body`, `invalid_channel_type`, `automod_blocked`, `ephemeral_forbidden`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `missing_access`, `missing_permissions`, `temporarily_banned`, `dm_closed`, `dm_window_closed`
- **HTTP 404:** `unknown_channel`
- **HTTP 413:** `body_too_large`, `file_too_large`
- **HTTP 429:** `rate_limited`, `slowmode`, `upload_quota`
- **HTTP 503:** `maintenance`

## Mesajı getir (`getMessage`)

**`GET https://noluyo.net/api/v1/channels/{channel_id}/messages/{message_id}`** (`GET /channels/{channel_id}/messages/{message_id}`)

Tek bir mesajı döndürür. Listeden farklı olarak, ReadMessageHistory yoksa missing_permissions döner. Sunucu kanalında, içerik intent'i olmayan bir bot başkalarının mesajlarını içeriği çıkarılmış olarak alır; botu etiketleyenler hariç.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `ReadMessageHistory`
- **Hız sınırı:** `read` (30 / 5s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `channel_id` | `path` | `string` | evet | Kanal ID'si. |
| `message_id` | `path` | `string` | evet | Mesaj ID'si. |

### Örnek çağrılar

```bash
curl -X GET "https://noluyo.net/api/v1/channels/111500000000000100/messages/111600000000000000" \
  -H "Authorization: Bot $BOT_TOKEN"
```

```js
// JavaScript (noluyo-bot)
await bot.rest.getMessage("111500000000000100", "111600000000000000");
```

```py
# Python (noluyo_bot)
await bot.rest.get_message("111500000000000100", "111600000000000000")
```

### Yanıt (200)

```json
{
  "id": "111600000000000000",
  "type": 0,
  "channel_id": "111500000000000100",
  "guild_id": "111500000000000000",
  "author": {
    "id": "111540000000000001",
    "username": "ornek_bot",
    "display_name": "Örnek Bot",
    "avatar": null,
    "cosmetics": null,
    "bot": true
  },
  "content": "Merhaba!",
  "timestamp": "2026-11-04T22:58:33.427Z",
  "edited_timestamp": null,
  "attachments": [],
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "pinned": false
}
```

### Hata kodları

- **HTTP 400:** `invalid_channel_type`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `missing_access`, `missing_permissions`, `temporarily_banned`
- **HTTP 404:** `unknown_channel`, `unknown_message`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Mesajı düzenle (`editMessage`)

**`PATCH https://noluyo.net/api/v1/channels/{channel_id}/messages/{message_id}`** (`PATCH /channels/{channel_id}/messages/{message_id}`)

Çağıranın kendi mesajını değiştirir. Kişi yalnızca content değiştirir. Bot content, embeds ve components alanlarını ayrı ayrı değiştirebilir: göndermediği alan kalır, boş liste embed veya bileşenleri kaldırır, yalnızca bileşen değişirse mesaj düzenlendi sayılmaz. Embed içindeki attachment:// yalnızca mesajın var olan dosyalarına bakar; yeni dosyalı istek reddedilir. Düzenleme, etiketlenenleri günceller ama kimseye yeniden bildirim göndermez. Dosya, iletme, anket, çıkartma veya embed içeren mesajın metni boşaltılabilir.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `SendMessages`
- **Hız sınırı:** `write` (10 / 10s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `channel_id` | `path` | `string` | evet | Kanal ID'si. |
| `message_id` | `path` | `string` | evet | Mesaj ID'si. |

### Gövde alanları

| Alan | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `content` | `string` | - | (<= 2000) |
| `embeds` | `Embed[]` | - | Yalnızca botlar için. Embed'lerin yerine geçer. attachment:// yalnızca mesajın var olan dosyalarına bakar; yeni dosya yeni mesajla gelir. (<= 10) |
| `components` | `MessageComponent[]` | - | Yalnızca botlar için. Satırların yerine geçer. Yalnızca bu değişirse mesaj düzenlendi sayılmaz. (<= 5) |
| `allowed_mentions` | `object` | - |  |
| `allowed_mentions.replied_user` | `boolean` | - |  |
| `allowed_mentions.parse` | `string[]` | - | Yalnızca botlar için. Metindeki hangi etiket türlerinin bildirim göndereceği. parse, users veya roles gönderilirse yalnızca listelenenler bildirim gönderir; varsayılan için üçünü de yazma. |
| `allowed_mentions.users` | `ID[]` | - | Yalnızca botlar için. parse içinde users yokken de bildirim gönderen kullanıcılar. parse içindeki users ile birlikte yazılamaz. En çok 100. (<= 100) |
| `allowed_mentions.roles` | `ID[]` | - | Yalnızca botlar için. parse içinde roles yokken de bildirim gönderen roller. parse içindeki roles ile birlikte yazılamaz. En çok 100. (<= 100) |

### Örnek çağrılar

```bash
curl -X PATCH "https://noluyo.net/api/v1/channels/111500000000000100/messages/111600000000000000" \
  -H "Authorization: Bot $BOT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"content":"Merhaba, düzenlendi!"}'
```

```js
// JavaScript (noluyo-bot)
await bot.rest.editMessage("111500000000000100", "111600000000000000", { content: "Merhaba, düzenlendi!" });
```

```py
# Python (noluyo_bot)
await bot.rest.edit_message("111500000000000100", "111600000000000000", {"content": "Merhaba, düzenlendi!"})
```

### Yanıt (200)

```json
{
  "id": "111600000000000000",
  "type": 0,
  "channel_id": "111500000000000100",
  "guild_id": "111500000000000000",
  "author": {
    "id": "111540000000000001",
    "username": "ornek_bot",
    "display_name": "Örnek Bot",
    "avatar": null,
    "cosmetics": null,
    "bot": true
  },
  "content": "Merhaba, düzenlendi!",
  "timestamp": "2026-11-04T22:58:33.427Z",
  "edited_timestamp": "2026-11-05T09:00:00Z",
  "attachments": [],
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "pinned": false
}
```

### Hata kodları

- **HTTP 400:** `validation_failed`, `invalid_body`, `invalid_channel_type`, `automod_blocked`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `not_author`, `system_message`, `missing_access`, `missing_permissions`, `temporarily_banned`, `dm_closed`
- **HTTP 404:** `unknown_channel`, `unknown_message`
- **HTTP 413:** `body_too_large`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Mesajı sil (`deleteMessage`)

**`DELETE https://noluyo.net/api/v1/channels/{channel_id}/messages/{message_id}`** (`DELETE /channels/{channel_id}/messages/{message_id}`)

Mesajı siler. Çağıranın kendi mesajı izin istemez; başkasının mesajı veya sunucudaki sistem mesajı ManageMessages ister.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `ManageMessages`
- **Hız sınırı:** `write` (10 / 10s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `channel_id` | `path` | `string` | evet | Kanal ID'si. |
| `message_id` | `path` | `string` | evet | Mesaj ID'si. |

### Örnek çağrılar

```bash
curl -X DELETE "https://noluyo.net/api/v1/channels/111500000000000100/messages/111600000000000000" \
  -H "Authorization: Bot $BOT_TOKEN"
```

```js
// JavaScript (noluyo-bot)
await bot.rest.deleteMessage("111500000000000100", "111600000000000000");
```

```py
# Python (noluyo_bot)
await bot.rest.delete_message("111500000000000100", "111600000000000000")
```

### Yanıt (204)

Yanıt gövdesi yok.

### Hata kodları

- **HTTP 400:** `invalid_channel_type`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `missing_access`, `missing_permissions`, `temporarily_banned`
- **HTTP 404:** `unknown_channel`, `unknown_message`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Birden çok mesajı sil (`bulkDeleteMessages`)

**`POST https://noluyo.net/api/v1/channels/{channel_id}/messages/bulk-delete`** (`POST /channels/{channel_id}/messages/bulk-delete`)

Sunucudaki bir metin kanalının 2 ile 100 arası mesajını siler; hiçbiri 14 günden eski olamaz. Var olmayan mesajların ID'leri yok sayılır, tekrar edenler bir kez sayılır.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `ManageMessages`
- **Hız sınırı:** `bulk` (1 / 1s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `channel_id` | `path` | `string` | evet | Kanal ID'si. |

### Gövde alanları

| Alan | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `messages` | `ID[]` | evet | (2–100) |

### Örnek çağrılar

```bash
curl -X POST "https://noluyo.net/api/v1/channels/111500000000000100/messages/bulk-delete" \
  -H "Authorization: Bot $BOT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"messages":["111600000000000000","111600000000000100"]}'
```

```js
// JavaScript (noluyo-bot)
await bot.rest.bulkDeleteMessages("111500000000000100", { messages: ["111600000000000000", "111600000000000100"] });
```

```py
# Python (noluyo_bot)
await bot.rest.bulk_delete_messages("111500000000000100", {"messages": ["111600000000000000", "111600000000000100"]})
```

### Yanıt (204)

Yanıt gövdesi yok.

### Hata kodları

- **HTTP 400:** `validation_failed`, `invalid_body`, `invalid_channel_type`, `messages_too_old`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `missing_access`, `missing_permissions`, `temporarily_banned`
- **HTTP 404:** `unknown_channel`
- **HTTP 413:** `body_too_large`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`
