# Etkileşimler

Botun, bileşenine basılmasına verdiği yanıt. Bu rotalar etkileşim token'ının yanında botun token'ını da ister.

## Etkileşime yanıt ver (`interactionCallback`)

**`POST https://noluyo.net/api/v1/interactions/{interaction_id}/{interaction_token}/callback`** (`POST /interactions/{interaction_id}/{interaction_token}/callback`)

Basmaya ya da komut çalıştırmaya verilen ilk yanıt, 3 saniye içinde gelmelidir; bir etkileşim bir yanıt alır. Mesaj yanıtlarından komut çalıştırma yalnızca type 4 ve 5 alır: güncellenecek mesajı yoktur. type 4 yeni mesaj yazar, 5 PATCH @original ile doldurulacak bir "düşünüyor" mesajı (flags 128) yazar, 6 yalnızca onaylar ve izin istemez, 7 basılan mesajı günceller, göndermediğin alan kalır. Reddedilen yanıt hakkı harcamaz. Basan kişiye başarı bildirilir. 4, 5 ve 7 {"message": ...} ile 200, 6 ise 204 döner. Yavaş mod işlemez; otomatik moderasyon ve ortak tavanlar işler. type 5, data içinden yalnızca flags'i okur; type 6 data'yı yok sayar. type 4 ya da 5 ile flags 64, yanıtı yalnızca basan kişiye gösterir ve kimliği etkileşimin kimliğidir; ephemeral mesaja basıldığında type 7 o mesajı bütünüyle değiştirir. Otomatik tamamlama (type 4) yalnızca data.choices ile type 8 alır; 204 döner, seçenekler yalnızca yazan kişiye gider ve token'ı takip mesajı ya da düzenleme almaz. Type 8 ve ephemeral yanıtlar ortak yazma tavanına sayılmaz: yalnızca herkesin gördüğü 4, 5 ve 7 sayılır. Komut çalıştırma ya da basma (otomatik tamamlama ve gönderilen form değil) bunun yerine data {custom_id, title, components} ile type 9 alabilir: kişiye form açılır, 204 döner, hiçbir şey yazmaz ve yazma tavanına sayılmaz. Formu açmak tek yanıttır; önce 5 verip sonra açamazsın. Kişinin gönderdiği yeni bir etkileşim (type 5) olarak gelir; o 4 ya da 5 alır, 6 ya da 7'yi yalnızca form bir mesajın butonundan açıldıysa alır. Etkileşim adresi olan uygulama etkileşimi orada alır ve aynı yanıtı o isteğin 200 gövdesi olarak verebilir; nasıl yapıldığını HTTP teslim rehberi anlatır.

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

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `interaction_id` | `path` | `string` | evet | INTERACTION_CREATE olayının id'si. |
| `interaction_token` | `path` | `string` | evet | Aynı olayın token'ı. Gizlidir, 15 dakika geçerlidir. |

### Gövde alanları

| Alan | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `type` | `integer` | evet | 4 yeni mesaj, 5 sonradan doldurulacak "düşünüyor" mesajı, 6 sessiz onay, 7 basılan mesajı güncelleme. 8 otomatik tamamlamanın seçenekleri; otomatik tamamlama yalnızca 8 alır. 9 form açma; komut çalıştırmaya ya da basmaya ilk yanıt olarak. (4, 5, 6, 7, 8, 9) |
| `data` | `object` | - | Yanıtın gösterdiği şey. Yeni mesajda metin ya da embed zorunludur. |
| `data.content` | `string` | - | (<= 2000) |
| `data.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) |
| `data.components` | `MessageComponent[]` | - | Yalnızca botlar için. Yalnızca bileşenli mesaj reddedilir: content, embed veya dosya gerekir. type 9'da formun alanları: 1-5 eylem satırı, her biri bir metin girişi (4) ya da etiketli bir menü taşır. (<= 5) |
| `data.allowed_mentions` | `object` | - |  |
| `data.allowed_mentions.replied_user` | `boolean` | - |  |
| `data.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. |
| `data.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) |
| `data.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) |
| `data.flags` | `integer` | - | 0 ya da yalnızca basan kişinin göreceği ephemeral yanıt için 64. Başka değer reddedilir. |
| `data.choices` | `OptionChoice[]` | - | Yalnızca type 8'de, orada zorunludur ve yanında mesajın başka alanı olmaz: en çok 25 öneri, her değer odaktaki seçeneğin türündedir. Boş liste hiçbir şeyin eşleşmediğini söyler. Kişi onları kendi dilinde görür (name_localizations). (<= 25) |
| `data.custom_id` | `string` | - | Yalnızca type 9'da, orada zorunludur: formun kimliği, kişinin gönderdiğiyle geri gelir. (<= 100) |
| `data.title` | `string` | - | Yalnızca type 9'da, orada zorunludur: formun başlığı. Otomatik moderasyon onu, etiketleri ve ön doldurulan değerleri okur. Kişi her formun altında kaldıramayacağın bir satır görür: form botuna gider, içine asla şifre ya da doğrulama kodu yazmamalıdır. (1–45) |

### Örnek çağrılar

```bash
curl -X POST "https://noluyo.net/api/v1/interactions/111600000000000400/$INTERACTION_TOKEN/callback" \
  -H "Authorization: Bot $BOT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"type":4,"data":{"content":"Kaydın alındı."}}'
```

```js
// JavaScript (noluyo-bot)
await bot.rest.interactionCallback("111600000000000400", process.env.INTERACTION_TOKEN, { type: 4, data: { content: "Kaydın alındı." } });
```

```py
# Python (noluyo_bot)
await bot.rest.interaction_callback("111600000000000400", os.environ["INTERACTION_TOKEN"], {"type": 4, "data": {"content": "Kaydın alındı."}})
```

### Yanıt (200)

```json
{
  "message": {
    "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": "Kaydın alındı.",
    "timestamp": "2026-11-04T22:58:33.427Z",
    "edited_timestamp": null,
    "attachments": [],
    "mentions": [],
    "mention_roles": [],
    "mention_everyone": false,
    "pinned": false,
    "nonce": "istek-1",
    "application_id": "111540000000000000",
    "interaction": {
      "id": "111600000000000400",
      "type": 3,
      "user": {
        "id": "111540000000000009",
        "username": "ayse",
        "display_name": null,
        "avatar": null,
        "cosmetics": null
      }
    }
  }
}
```

### Hata kodları

- **HTTP 400:** `interaction_token_invalid`, `interaction_expired`, `interaction_timeout`, `interaction_already_acknowledged`, `interaction_response_invalid`, `validation_failed`, `invalid_body`, `automod_blocked`, `ephemeral_files`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `bot_forbidden`, `missing_access`, `missing_permissions`, `temporarily_banned`, `dm_closed`
- **HTTP 404:** `unknown_channel`, `unknown_message`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Takip mesajı gönder (`createInteractionFollowup`)

**`POST https://noluyo.net/api/v1/interactions/{interaction_id}/{interaction_token}/messages`** (`POST /interactions/{interaction_id}/{interaction_token}/messages`)

Yanıtlanmış bir etkileşim için bir mesaj daha yazar; basmadan sonra 15 dakika boyunca, etkileşim başına en çok 5 tane. Dosyalar, mesaj göndermedeki gibi multipart/form-data ve AttachFiles ile gider. flags 64 onu yalnızca basan kişiye gösterir; dosya almaz.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **İzinler:** `SendMessages`, `AttachFiles`
- **Hız sınırı:** `interaction` (50 / 1s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `interaction_id` | `path` | `string` | evet | INTERACTION_CREATE olayının id'si. |
| `interaction_token` | `path` | `string` | evet | Aynı olayın token'ı. Gizlidir, 15 dakika geçerlidir. |

### Gövde alanları

| Alan | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `content` | `string` | - | (<= 2000) |
| `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. type 9'da formun alanları: 1-5 eylem satırı, her biri bir metin girişi (4) ya da etiketli bir menü taşır. (<= 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) |
| `flags` | `integer` | - | 0 ya da yalnızca basan kişinin göreceği ephemeral yanıt için 64. Başka değer reddedilir. |
| `choices` | `OptionChoice[]` | - | Yalnızca type 8'de, orada zorunludur ve yanında mesajın başka alanı olmaz: en çok 25 öneri, her değer odaktaki seçeneğin türündedir. Boş liste hiçbir şeyin eşleşmediğini söyler. Kişi onları kendi dilinde görür (name_localizations). (<= 25) |
| `custom_id` | `string` | - | Yalnızca type 9'da, orada zorunludur: formun kimliği, kişinin gönderdiğiyle geri gelir. (<= 100) |
| `title` | `string` | - | Yalnızca type 9'da, orada zorunludur: formun başlığı. Otomatik moderasyon onu, etiketleri ve ön doldurulan değerleri okur. Kişi her formun altında kaldıramayacağın bir satır görür: form botuna gider, içine asla şifre ya da doğrulama kodu yazmamalıdır. (1–45) |

### Örnek çağrılar

```bash
curl -X POST "https://noluyo.net/api/v1/interactions/111600000000000400/$INTERACTION_TOKEN/messages" \
  -H "Authorization: Bot $BOT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"content":"Bir şey daha"}'
```

```js
// JavaScript (noluyo-bot)
await bot.rest.createInteractionFollowup("111600000000000400", process.env.INTERACTION_TOKEN, { content: "Bir şey daha" });
```

```py
# Python (noluyo_bot)
await bot.rest.create_interaction_followup("111600000000000400", os.environ["INTERACTION_TOKEN"], {"content": "Bir şey daha"})
```

### 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": "Kaydın alındı.",
  "timestamp": "2026-11-04T22:58:33.427Z",
  "edited_timestamp": null,
  "attachments": [],
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "pinned": false,
  "nonce": "istek-1",
  "application_id": "111540000000000000",
  "interaction": {
    "id": "111600000000000400",
    "type": 3,
    "user": {
      "id": "111540000000000009",
      "username": "ayse",
      "display_name": null,
      "avatar": null,
      "cosmetics": null
    }
  }
}
```

### Hata kodları

- **HTTP 400:** `interaction_token_invalid`, `interaction_expired`, `interaction_not_acknowledged`, `validation_failed`, `invalid_body`, `automod_blocked`, `ephemeral_files`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `bot_forbidden`, `missing_access`, `missing_permissions`, `temporarily_banned`, `dm_closed`
- **HTTP 404:** `unknown_channel`
- **HTTP 413:** `body_too_large`, `file_too_large`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Etkileşimin mesajını düzenle (`editInteractionMessage`)

**`PATCH https://noluyo.net/api/v1/interactions/{interaction_id}/{interaction_token}/messages/{message_id}`** (`PATCH /interactions/{interaction_id}/{interaction_token}/messages/{message_id}`)

Bu etkileşimin bir mesajını düzenler: @original type 4 veya 5 yanıtıdır, takip mesajı kendi kimliğiyle bulunur. Göndermediğin alan kalır. "Düşünüyor" mesajını doldurmak flags 128'i siler, düzenlendi işareti koymaz, içindeki etiket de bildirim göndermez. Satırı olmayan kimlik ephemeral mesaj sayılır, yanıtın satırı yoksa @original da: 200 döner, yalnızca basan kişiye gider, göndermediğin alan gider. Hiç gönderilmemiş kimliği tutan istemci olmadığından type 6 ya da 7 sonrası ekranda bir şey değişmez. Ephemeral düzenleme etkileşim başına 5 saniyede en çok 5 kezdir.

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

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `interaction_id` | `path` | `string` | evet | INTERACTION_CREATE olayının id'si. |
| `interaction_token` | `path` | `string` | evet | Aynı olayın token'ı. Gizlidir, 15 dakika geçerlidir. |
| `message_id` | `path` | `string` | evet | Bu etkileşimin bir mesajı ya da type 4 veya 5 yanıtı için @original. |

### 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/interactions/111600000000000400/$INTERACTION_TOKEN/messages/@original" \
  -H "Authorization: Bot $BOT_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"content":"Rapor hazır."}'
```

```js
// JavaScript (noluyo-bot)
await bot.rest.editInteractionMessage("111600000000000400", process.env.INTERACTION_TOKEN, "@original", { content: "Rapor hazır." });
```

```py
# Python (noluyo_bot)
await bot.rest.edit_interaction_message("111600000000000400", os.environ["INTERACTION_TOKEN"], "@original", {"content": "Rapor hazır."})
```

### 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": "Kaydın alındı.",
  "timestamp": "2026-11-04T22:58:33.427Z",
  "edited_timestamp": null,
  "attachments": [],
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "pinned": false,
  "nonce": "istek-1",
  "application_id": "111540000000000000",
  "interaction": {
    "id": "111600000000000400",
    "type": 3,
    "user": {
      "id": "111540000000000009",
      "username": "ayse",
      "display_name": null,
      "avatar": null,
      "cosmetics": null
    }
  }
}
```

### Hata kodları

- **HTTP 400:** `interaction_token_invalid`, `interaction_expired`, `interaction_not_acknowledged`, `validation_failed`, `invalid_body`, `automod_blocked`, `ephemeral_files`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `bot_forbidden`, `missing_access`, `missing_permissions`, `temporarily_banned`, `dm_closed`
- **HTTP 404:** `unknown_channel`, `unknown_message`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`

## Etkileşimin mesajını sil (`deleteInteractionMessage`)

**`DELETE https://noluyo.net/api/v1/interactions/{interaction_id}/{interaction_token}/messages/{message_id}`** (`DELETE /interactions/{interaction_id}/{interaction_token}/messages/{message_id}`)

Bu etkileşimin bir mesajını siler; PATCH hangilerine ulaşıyorsa onlara. Kendi mesajların gibi izin istemez. Ephemeral mesaj basan kişinin ekranlarından gider.

- **Kimlik:** Bot token'ı (`Authorization: Bot <BOT_TOKEN>`)
- **Hız sınırı:** `interaction` (50 / 1s)

### Parametreler

| Ad | Konum | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `interaction_id` | `path` | `string` | evet | INTERACTION_CREATE olayının id'si. |
| `interaction_token` | `path` | `string` | evet | Aynı olayın token'ı. Gizlidir, 15 dakika geçerlidir. |
| `message_id` | `path` | `string` | evet | Bu etkileşimin bir mesajı ya da type 4 veya 5 yanıtı için @original. |

### Örnek çağrılar

```bash
curl -X DELETE "https://noluyo.net/api/v1/interactions/111600000000000400/$INTERACTION_TOKEN/messages/@original" \
  -H "Authorization: Bot $BOT_TOKEN"
```

```js
// JavaScript (noluyo-bot)
await bot.rest.deleteInteractionMessage("111600000000000400", process.env.INTERACTION_TOKEN, "@original");
```

```py
# Python (noluyo_bot)
await bot.rest.delete_interaction_message("111600000000000400", os.environ["INTERACTION_TOKEN"], "@original")
```

### Yanıt (204)

Yanıt gövdesi yok.

### Hata kodları

- **HTTP 400:** `interaction_token_invalid`, `interaction_expired`, `interaction_not_acknowledged`
- **HTTP 401:** `unauthorized`
- **HTTP 403:** `bot_forbidden`, `missing_access`, `temporarily_banned`
- **HTTP 404:** `unknown_channel`, `unknown_message`
- **HTTP 429:** `rate_limited`
- **HTTP 503:** `maintenance`
