Merhabalar cursor pro ile baya yapmıştımda süresi bitti yapamıyorum. Sizden istediğim ticket açıldıgı zaman tickete hiç mesaj atılmadıgı takdirde ticket 1 dakika sonra kapatılsın otomatik olarak



const { Permissions, MessageEmbed, MessageActionRow, MessageButton, MessageSelectMenu } = require('discord.js');
const { createWriteStream } = require('fs');

// ==================== BUTONLA ROL ALMA SİSTEMİ ====================

const roles = {
tiktok: '1370742863695970328',

twitch: '1372945246543020182',
};

const CATEGORIES = {
tiktok: '1370742864555802702',
twitch: '1370742864555802702',
};

const clickedUsers = new Set();
// Yetkili çağırma butonunun kullanım süresini takip etmek için
const staffCallCooldowns = new Map();

module.exports = async (client, interaction) => {
if (!interaction.isButton() && !interaction.isSelectMenu()) return;

// ==================== BUTONLA ROL ALMA ====================

const customId = interaction.customId;
if (roles[customId]) {
if (clickedUsers.has(interaction.user.id)) {
return interaction.reply({ content: '❌ Zaten bir seçim yaptın.', ephemeral: true });
}

const roleId = roles[customId];
const role = interaction.guild.roles.cache.get(roleId);
const member = interaction.guild.members.cache.get(interaction.us er.id);

if (!role) {
return interaction.reply({ content: '⚠️ Rol bulunamadı.', ephemeral: true });
}

await member.roles.add(role);
clickedUsers.add(interaction.user.id);

await interaction.reply({ content: `✅ **${role.name}** rolünü aldın! Sana özel bir kanal oluşturuldu.`, ephemeral: true });

const channelName = `${interaction.user.username.toLowerCase()}`.repla ce(/[^a-z0-9-]/g, '');
const categoryId = CATEGORIES[customId];

const channel = await interaction.guild.channels.create(channelName, {
type: 'GUILD_TEXT',
parent: categoryId || null,
permissionOverwrites: [
{
id: interaction.guild.id,
deny: [Permissions.FLAGS.VIEW_CHANNEL],
},
{
id: interaction.user.id,
allow: [
Permissions.FLAGS.VIEW_CHANNEL,
Permissions.FLAGS.SEND_MESSAGES,
Permissions.FLAGS.READ_MESSAGE_HISTORY,


],
},
{
id: client.user.id,
allow: [
Permissions.FLAGS.VIEW_CHANNEL,
Permissions.FLAGS.SEND_MESSAGES,
Permissions.FLAGS.MANAGE_CHANNELS,
],
},
],
});

channel.send(`👋 Merhaba ${interaction.user}, **${role.name}** rolünü seçtiğin için bu kanal senin için oluşturuldu!`);
return;
}



client.on('interactionCreate', async (interaction) => {
if (!interaction.isButton()) return;

if (interaction.customId === 'hizmet_talep') {
const hizmetSahibiId = '637252039901970433';
const hizmetSahibi = await client.users.fetch(hizmetSahibiId).catch(() => null);

if (hizmetSahibi) {
hizmetSahibi.send(`📬 Hizmetleriniz hakkında şu kişi butona tıkladı: <@${interaction.user.id}>`)
.catch(() => console.log('DM gönderilemedi.'));
}

await interaction.reply({ content: 'İlginiz için teşekkürler! Hizmet sahibine bilgi verildi.', ephemeral: true });
}
});














client.on('interactionCreate', async (interaction) => {
if (!interaction.isButton()) return;

if (interaction.customId === 'yayın_talep') {
const hizmetSahibiId = '637252039901970433';
const hizmetSahibi = await client.users.fetch(hizmetSahibiId).catch(() => null);

if (hizmetSahibi) {
hizmetSahibi.send(`📬 Yayıncı bilgi almak istiyor: <@${interaction.user.id}>`)
.catch(() => console.log('DM gönderilemedi.'));
}

await interaction.reply({ content: 'İlginiz için teşekkürler! Hizmet sahibine bilgi verildi.', ephemeral: true });
}
});










const vipRolID = '1382250916966830143';
const izinliKullaniciID = '1380439588924948510'; // Kim basabiliyorsa onun ID'si

if (interaction.isButton() && interaction.customId === 'rol_ver') {
if (interaction.user.id !== izinliKullaniciID) {
return interaction.reply({
content: '❌ Butona sadece Vip ücreti ödemiş kullanıcılar basabilir. <#1376854710920679554> açarak sende vip olabilirsin',
ephemeral: true
});
}

const member = interaction.guild.members.cache.get(interaction.us er.id);
if (!member) return;

if (member.roles.cache.has(vipRolID)) {
return interaction.reply({
content: 'Zaten bu role sahipsin!',
ephemeral: true
});
}

try {
await member.roles.add(vipRolID);
return interaction.reply({
content: '✅ Rol başarıyla verildi!',
ephemeral: true
});
} catch (err) {
console.error('Rol verilirken hata:', err);
return interaction.reply({
content: '❌ Rol verilirken bir hata oluştu.',
ephemeral: true
});
}
}






// ==================== TICKET SİSTEMİ ====================

const allowedRoleId = '1357630446607007804';
const logChannelId = '1357637412184002595';
const ticketCategoryId = '1376854678750625892';
let bakimModu = false;

const [action, userId] = interaction.customId?.split('_') || [];

if (bakimModu) {
return interaction.reply({
content: '🔧 Bot şu anda bakımda. Butonlar kullanılamaz. Tahmini süre : 15 dakika',
ephemeral: true
});
}

if (interaction.customId === 'createTicket') {
const embed = new MessageEmbed()
.setColor('YELLOW')
.setTitle('📜 Destek Talebi Kuralları')
.setDescription(
`Lütfen destek talebi oluşturmadan önce aşağıdaki kuralları dikkatlice okuyun:nn` +
`• Gereksiz yere destek talebi açmayınız.n` +
`• Aynı konu hakkında birden fazla destek talebi oluşturmayınız.n` +
`• Saygılı ve düzgün bir dil kullanınız.n` +
`• Destek ekibine küfür/hakaret içeren mesajlar yasaktır.n` +
`• Destek talebi açtıktan sonra sabırlı olunuz, yetkililer en kısa sürede cevap verecektir.nn` +
`Kuralları okuduğunuzu ve kabul ettiğinizi onaylamak için aşağıdaki butona tıklayınız.`
);

const row = new MessageActionRow().addComponents(
new MessageButton()
.setCustomId('rulesAccept')
.setLabel('✅ Kuralları Okudum ve Kabul Ediyorum')
.setStyle('SUCCESS')
);

return interaction.reply({ embeds: [embed], components: [row], ephemeral: true });
}

if (interaction.customId === 'rulesAccept') {
const selectMenu = new MessageSelectMenu()
.setCustomId('newTicket')
.setPlaceholder('📩 Destek Talebi Sebebini Seçiniz!')
.addOptions([
{ emoji: '📌', label: 'Genel Sorunlar', value: 'newTicket_Soru/Sorun Bildirimi' },
{ emoji: '📌', label: 'Hata Bildirimi', value: 'newTicket_Küfür/Hakaret Bildirimi' },
{ emoji: '📌', label: 'Ödeme Sorunları', value: 'newTicket_Ödeme Sorunları' },
{ emoji: '📌', label: 'Öneri / İstek / Şikayet', value: 'newTicket_Hile/Bot Bildirimi' }
]);

const row = new MessageActionRow().addComponents(selectMenu);
return interaction.update({ content: '📩 Destek Talebi Sebebini Seçiniz!', components: [row], embeds: [] });
}

if (interaction.isSelectMenu() && interaction.customId === 'newTicket') {
const reason = interaction.values[0].split('_')[1];
const existingChannel = interaction.guild.channels.cache.find(channel =>
channel.name.endsWith(interaction.member.id)
);

if (existingChannel) {
return interaction.update({
content: `Zaten açık bir destek talebiniz var: <#${existingChannel.id}> ❌`,
components: [],
ephemeral: true
});
}

const randomTicketNumber = Math.floor(1000 + Math.random() * 9000);
const channelName = `bilet-${randomTicketNumber}-${interaction.user.id}`;

const channel = await interaction.guild.channels.create(channelName, {
type: 'GUILD_TEXT',
topic: `Ticket ${interaction.member.user.username} tarafından oluşturuldu. Sebep: ${reason}`,
parent: ticketCategoryId,
permissionOverwrites: [
{ id: interaction.guild.id, deny: ['VIEW_CHANNEL'] },
{ id: interaction.member.id, allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES'] }, // Burada ATTACH_FILES eklendi
{ id: client.user.id, allow: ['VIEW_CHANNEL', 'SEND_MESSAGES'] },
{ id: allowedRoleId, allow: ['VIEW_CHANNEL', 'SEND_MESSAGES'] }
]
});

const embed = new MessageEmbed()
.setColor('GREEN')
.setAuthor(`🎟️ Destek Talebiniz Oluşturuldu: ${interaction.member.user.username}`)
.setDescription(`**Sebep* ${reason}nn*Lütfen sorununuzu yetkililer gelene kadar detaylıca anlatınız. Ve lütfen yetkilileri etiketlemeyiniz.*`);

// Butonlar yerine select menü oluşturalım
const ticketActionMenu = new MessageSelectMenu()
.setCustomId(`ticketAction_${interaction.member.id }`)
.setPlaceholder('🛠️ İşlem Seçin')
.addOptions([
{ emoji: '🔒', label: 'Kapat', value: `closeTicket_${interaction.member.id}`, description: 'Destek talebini kapat' },
{ emoji: '⭐', label: 'Değerlendir', value: `sendFeedback_${interaction.member.id}`, description: 'Destek talebini değerlendir' },
{ emoji: '✅', label: 'Çözüldü', value: `resolved_${interaction.member.id}`, description: 'Çözüldü olarak işaretle' },
{ emoji: '🔔', label: 'Destek Çağır', value: `callStaff_${interaction.member.id}`, description: 'Yetkilileri Çağır' },
{ emoji: '📢', label: 'Tickete Çağır', value: `callUser_${interaction.member.id}`, description: 'Ticket Açan Kişiyi Çağır' }
]);

const row = new MessageActionRow().addComponents(ticketActionMenu) ;

await channel.send(`<@${interaction.member.id}> | <@&${allowedRoleId}>`);

// Ticket açıldıktan sonra bilgilendirme mesajını embed içinde gönder
setTimeout(() => {
const welcomeEmbed = new MessageEmbed()
.setColor('#2F3136')
.setTitle('📩 Destek Talebiniz Açıldı')
.setDescription('**Sorununuzla aktif olan yetkilimiz en kısa sürede sizlerle ilgilenecektir.**nn**Lütfen yetkililer gelene kadar sorununuzu detaylıca açıklayınız.**')
.setFooter('Destek Sistemi', interaction.guild.iconURL({ dynamic: true }))
.setTimestamp();

channel.send({ embeds: [welcomeEmbed] });
}, 1000);

await channel.send({ embeds: [embed], components: [row] });

return interaction.update({ content: `🎫 Destek Talebi oluşturuldu: <#${channel.id}> ✅`, components: [], ephemeral: true });
}

// Select menü için işlem kontrolü
if (interaction.isSelectMenu() && interaction.customId.startsWith('ticketAction_')) {
const ticketOwnerId = interaction.customId.split('_')[1];
const selectedValue = interaction.values[0];
const [selectedAction, selectedUserId] = selectedValue.split('_');

// Seçilen işleme göre işlem yapalım
switch (selectedAction) {
case 'callUser':
// Yetkili çağırma işlemleri
if (!interaction.member.roles.cache.has(allowedRoleId )) {
return interaction.reply({ content: 'Bu işlemi sadece yetkililer kullanabilir! ❌', ephemeral: true });
}

const userToCall = await interaction.guild.members.fetch(ticketOwnerId).cat ch(() => null);
if (!userToCall) {
return interaction.reply({ content: 'Ticket sahibi bulunamadı! ❌', ephemeral: true });
}

// Ticket sahibine özel mesaj gönderme
try {
await userToCall.send({
content: `🔔 **Ticket Çağrısı!**nYetkililer sizi <#${interaction.channel.id}> kanalındaki destek talebinize çağırıyor!`
});

return interaction.reply({
content: `📢 Ticket sahibi <@${ticketOwnerId}> başarıyla çağrıldı! Kendisine özel mesaj gönderildi.`,
ephemeral: true
});
} catch (error) {
return interaction.reply({
content: `⚠️ Ticket sahibine özel mesaj gönderilemedi. Muhtemelen DM'leri kapalı.`,
ephemeral: true
});
}

case 'callStaff':
// Yetkili çağırma işlemleri
if (interaction.user.id !== ticketOwnerId) {
return interaction.reply({ content: 'Bu işlemi sadece ticket sahibi kullanabilir! ❌', ephemeral: true });
}

// 30 dakika bekleme süresi kontrolü
const cooldownKey = `${interaction.channel.id}-${interaction.user.id}`;
const cooldownTime = 30 * 60 * 1000; // 30 dakika (milisaniye cinsinden)
const now = Date.now();

if (staffCallCooldowns.has(cooldownKey)) {
const expirationTime = staffCallCooldowns.get(cooldownKey) + cooldownTime;

if (now < expirationTime) {
const timeLeft = Math.ceil((expirationTime - now) / 1000 / 60); // Kalan süre (dakika)
return interaction.reply({
content: `⏰ Bu işlemi tekrar kullanabilmek için ${timeLeft} dakika beklemeniz gerekiyor.`,
ephemeral: true
});
}
}

// Bekleme süresini güncelle
staffCallCooldowns.set(cooldownKey, now);

// 30 dakika sonra cooldown'u temizle (opsiyonel)
setTimeout(() => staffCallCooldowns.delete(cooldownKey), cooldownTime);

const staffRole = interaction.guild.roles.cache.get(allowedRoleId);
if (!staffRole) {
return interaction.reply({ content: 'Yetkili rolü bulunamadı! ❌', ephemeral: true });
}

// Yetkili rolündeki tüm üyelere DM gönderme
let sentCount = 0;
const staffMembers = staffRole.members;

staffMembers.forEach(async (member) => {
try {
await member.send({
content: `🔔 **Acil Yetkili Çağrısı!**n<@${interaction.user.id}> sizi <#${interaction.channel.id}> kanalındaki destek talebine çağırıyor!`
});
sentCount++;
} catch (error) {
// DM gönderilemedi, devam et
}
});

return interaction.reply({
content: `🔔 Yetkili çağrısı gönderildi! Bu işlemi tekrar kullanabilmek için 30 dakika beklemeniz gerekecek.`,
ephemeral: true
});

case 'closeTicket':
if (!interaction.member.roles.cache.has(allowedRoleId ))
return interaction.reply({ content: 'Sadece yetkililer kapatabilir! ❌', ephemeral: true });

const ticketMessage = await interaction.message.fetch();

// Çözüldü kontrolü
let isResolved = false;
const ticketActionMenu = ticketMessage.components[0]?.components[0];
if (ticketActionMenu) {
const resolvedOption = ticketActionMenu.options.find(option => option.value.startsWith('resolved_'));
if (resolvedOption && !resolvedOption.default) {
return interaction.reply({ content: 'Destek talebini kapatmadan önce "Çözüldü" seçeneğini işaretlemeniz gerekmektedir. ❌', ephemeral: true });
}
}

const memberToClose = await interaction.guild.members.fetch(ticketOwnerId).cat ch(() => null);
if (!memberToClose) return interaction.reply({ content: 'Kullanıcı bulunamadı ❌', ephemeral: true });

// Ticket sahibine özel mesaj gönderme
try {
const ticketClosedEmbed = new MessageEmbed()
.setColor('RED')
.setTitle('🔒 Destek Talebiniz Kapatıldı')
.setDescription(`**${interaction.channel.name}** adlı destek talebiniz <@${interaction.user.id}> tarafından kapatılmıştır.`)
.setTimestamp()
.setFooter('Yeni bir sorun yaşarsanız tekrar destek talebi açabilirsiniz.');

await memberToClose.send({ embeds: [ticketClosedEmbed] });
} catch (error) {
// DM gönderilemedi, devam et
console.log('Ticket sahibine DM gönderilemedi:', error);
}

await interaction.channel.permissionOverwrites.edit(memb erToClose, { VIEW_CHANNEL: false, SEND_MESSAGES: false });

const closeEmbed = new MessageEmbed()
.setColor('RED')
.setAuthor(`🔒 ${interaction.member.user.username} Destek talebini kapattı`)
.setDescription('*Destek talebi silmek, kaydetmek veya yeniden açmak için aşağıdaki menüyü kullanın.*');

// Kapatma sonrası menü
const closeMenu = new MessageSelectMenu()
.setCustomId(`closedTicketAction_${ticketOwnerId}` )
.setPlaceholder('🛠️ İşlem Seçin')
.addOptions([
{ emoji: '🔓', label: 'Yeniden Aç', value: `reopenTicket_${ticketOwnerId}`, description: 'Destek talebini yeniden aç' },
{ emoji: '📄', label: 'Kaydet', value: 'saveTicket', description: 'Destek talebini kaydet' },
{ emoji: '🗑️', label: 'Sil', value: 'deleteTicket', description: 'Destek talebini sil' }
]);

const closeRow = new MessageActionRow().addComponents(closeMenu);

return interaction.reply({ embeds: [closeEmbed], components: [closeRow] });

case 'resolved':
if (!interaction.member.roles.cache.has(allowedRoleId ))
return interaction.reply({ content: 'Sadece yetkililer bu işlemi yapabilir! ❌', ephemeral: true });

const logChannel = interaction.guild.channels.cache.get(logChannelId) ;
if (logChannel?.isText()) {
await logChannel.send(`✅ <@${interaction.member.id}> tarafından ticket <#${interaction.channel.id}> çözüldü olarak işaretlendi.`);
}

// Menüyü güncelle, çözüldü seçeneğini devre dışı bırak
const message = await interaction.message.fetch();
const currentMenu = message.components[0].components[0];

const updatedMenu = new MessageSelectMenu()
.setCustomId(currentMenu.customId)
.setPlaceholder('🛠️ İşlem Seçin (✅ Çözüldü)');

// Mevcut seçenekleri kopyala, çözüldü seçeneğini güncelle
currentMenu.options.forEach(option => {
if (option.value.startsWith('resolved_')) {
updatedMenu.addOptions({
emoji: '✅',
label: 'Çözüldü ✓',
value: option.value,
description: 'Bu sorun çözüldü',
default: true // Seçili olarak işaretle
});
} else {
updatedMenu.addOptions(option);
}
});

const updatedRow = new MessageActionRow().addComponents(updatedMenu);

await interaction.update({
content: '✅ Destek talebi çözüldü olarak işaretlendi.',
components: [updatedRow]
});
break;

case 'sendFeedback':
const feedbackMenu = new MessageSelectMenu()
.setCustomId(`feedback_${ticketOwnerId}`)
.setPlaceholder('Geri Bildiriminizi Seçin')
.addOptions([
{ label: '⭐', value: '1', description: 'Çok Kötü' },
{ label: '⭐⭐', value: '2', description: 'Kötü' },
{ label: '⭐⭐⭐', value: '3', description: 'Orta' },
{ label: '⭐⭐⭐⭐', value: '4', description: 'İyi' },
{ label: '⭐⭐⭐⭐⭐', value: '5', description: 'Çok İyi' }
]);

return interaction.reply({
content: 'Hizmetimizle ilgili geri bildiriminizi seçin:',
components: [new MessageActionRow().addComponents(feedbackMenu)],
ephemeral: true
});
}
}

// Kapatılmış ticket işlemleri için select menü kontrolü
if (interaction.isSelectMenu() && interaction.customId.startsWith('closedTicketActio n_')) {
const ticketOwnerId = interaction.customId.split('_')[1];
const selectedValue = interaction.values[0];

if (selectedValue.startsWith('reopenTicket_')) {
const memberToOpen = await interaction.guild.members.fetch(ticketOwnerId).cat ch(() => null);
if (!memberToOpen) return interaction.reply({ content: 'Kullanıcı bulunamadı ❌', ephemeral: true });

await interaction.channel.permissionOverwrites.edit(memb erToOpen, { VIEW_CHANNEL: true, SEND_MESSAGES: true });

// Ticket sahibine özel mesaj gönderme
try {
const ticketReopenedEmbed = new MessageEmbed()
.setColor('GREEN')
.setTitle('🔓 Destek Talebiniz Yeniden Açıldı')
.setDescription(`**${interaction.channel.name}** adlı destek talebiniz <@${interaction.user.id}> tarafından yeniden açılmıştır.`)
.setTimestamp();

await memberToOpen.send({ embeds: [ticketReopenedEmbed] });
} catch (error) {
// DM gönderilemedi, devam et
console.log('Ticket sahibine DM gönderilemedi:', error);
}

// Orijinal ticket menüsünü yeniden oluştur
const ticketActionMenu = new MessageSelectMenu()
.setCustomId(`ticketAction_${ticketOwnerId}`)
.setPlaceholder('🛠️ İşlem Seçin')
.addOptions([
{ emoji: '🔒', label: 'Kapat', value: `closeTicket_${ticketOwnerId}`, description: 'Destek talebini kapat' },
{ emoji: '⭐', label: 'Değerlendir', value: `sendFeedback_${ticketOwnerId}`, description: 'Destek talebini değerlendir' },
{ emoji: '✅', label: 'Çözüldü', value: `resolved_${ticketOwnerId}`, description: 'Çözüldü olarak işaretle' },
{ emoji: '🔔', label: 'Destek Çağır', value: `callStaff_${ticketOwnerId}`, description: 'Yetkilileri çağır' },
{ emoji: '📢', label: 'Tickete Çağır', value: `callUser_${ticketOwnerId}`, description: 'Ticket sahibini çağır' }
]);

const row = new MessageActionRow().addComponents(ticketActionMenu) ;

return interaction.update({
embeds: [new MessageEmbed().setColor('GREEN').setAuthor('🔓 Destek talebi yeniden açıldı ✅')],
components: [row]
});
}
else if (selectedValue === 'deleteTicket') {
// Ticket silindiğinde özel mesaj gönderme kaldırıldı
return interaction.channel.delete();
}
else if (selectedValue === 'saveTicket') {
const messages = (await interaction.channel.messages.fetch()).filter(m => !m.author.bot).map(m => {
const date = new Date(m.createdTimestamp).toLocaleString();
const user = `${m.author.tag}${m.author.id === ticketOwnerId ? ' (ticket sahibi)' : ''}`;
return `${date} - ${user}: ${m.content || (m.attachments.first()?.proxyURL ?? '')}`;
}).reverse().join('n');

const fileName = `./data/ticket_${Date.now()}.txt`;
const stream = createWriteStream(fileName);
stream.write(`Destek Talebi Logları (${interaction.channel.name})nn${messages}`);
stream.end();

stream.on('finish', async () => {
const logChannel = interaction.guild.channels.cache.get(logChannelId) ;
if (logChannel?.isText()) {
await logChannel.send({ content: `📄 Destek Talebi logları (${interaction.channel.name}):`, files: [fileName] });
return interaction.reply({ content: 'Loglar başarıyla gönderildi ✅', ephemeral: true });
}
return interaction.reply({ content: 'Log kanalı bulunamadı ❌', ephemeral: true });
});
}
}

if (interaction.isSelectMenu() && interaction.customId.startsWith('feedback_')) {
const memberId = interaction.customId.split('_')[1];
const stars = interaction.values[0];
const logChannel = interaction.guild.channels.cache.get(logChannelId) ;

if (logChannel?.isText()) {
await logChannel.send(`<@${memberId}> tarafından verilen geri bildirim: ${stars} ⭐`);
}

return interaction.update({
content: `Teşekkür ederiz! Geri bildiriminiz: ${stars} ⭐`,
components: [],
ephemeral: true
});
}
};