DeepSeek icin gelismis alarm kontrol paneli
// ==UserScript==
// @name Deep Screen
// @namespace https://greasyfork.org/users/deep-screen-alarm
// @version 3.1.0
// @description DeepSeek icin gelismis alarm kontrol paneli
// @author Ali Osman Dinke
// @match https://chat.deepseek.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @run-at document-end
// @license MIT
// ==/UserScript==
(function() {
'use strict';
let soundList = GM_getValue('soundList', []);
let activeSoundId = GM_getValue('activeSoundId', null);
if (soundList.length === 0) {
soundList.push({
id: Date.now(),
ad: 'ARINMA GECESI',
url: 'https://myinstants.net/AllSounds/17d08409-00c9-4544-b61a-394cb5add81c.mp3',
tur: 'UYARI'
});
activeSoundId = soundList[0].id;
GM_setValue('soundList', soundList);
GM_setValue('activeSoundId', activeSoundId);
}
let settings = {
enabled: GM_getValue('enabled', true),
volume: GM_getValue('volume', 0.7),
flashEffect: GM_getValue('flashEffect', true),
flashColor: GM_getValue('flashColor', '#ff0000'),
titleAlert: GM_getValue('titleAlert', true),
titleText: GM_getValue('titleText', '🔴 CONTINUE BUTONU! 🔴'),
titleText2: GM_getValue('titleText2', '🚨 ALARM AKTIF! 🚨')
};
let isAlerting = false;
let currentAudio = null;
let flashInterval = null;
const soundTypes = ['YUMUSAK', 'UYARI', 'ALARM', 'EGLENCELI', 'BILDIRIM'];
function getActiveSound() {
return soundList.find(s => s.id === activeSoundId) || soundList[0];
}
function createPanel() {
const panel = document.createElement('div');
panel.id = 'deep-screen-panel';
panel.innerHTML = `
<style>
#deep-screen-panel {
position: fixed;
top: 20px;
right: 20px;
width: 340px;
background: white;
border-radius: 12px;
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
z-index: 10000;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
border: 1px solid #ddd;
}
#deep-screen-panel.minimized {
width: auto;
background: white;
}
.panel-header {
padding: 12px 16px;
background: white;
color: black;
border-radius: 12px 12px 0 0;
cursor: move;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #ddd;
}
.panel-header-left {
display: flex;
align-items: center;
gap: 10px;
}
.panel-logo {
width: 28px;
height: 28px;
border-radius: 6px;
}
.panel-title {
font-size: 20px;
font-weight: bold;
letter-spacing: 3px;
color: black;
}
.minimize-btn {
background: #f0f0f0;
border: none;
color: black;
cursor: pointer;
width: 30px;
height: 30px;
border-radius: 6px;
font-size: 18px;
}
.minimize-btn:hover {
background: #e0e0e0;
}
.settings-area {
padding: 16px;
background: white;
}
.setting-group {
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid #eee;
}
.setting-label {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
font-size: 14px;
font-weight: bold;
color: black;
text-transform: uppercase;
}
.gear-icon {
cursor: pointer;
font-size: 16px;
margin-left: 8px;
transition: transform 0.2s;
}
.gear-icon:hover {
transform: rotate(30deg);
}
input[type="range"] {
width: 100%;
height: 6px;
border-radius: 3px;
background: #ddd;
outline: none;
-webkit-appearance: none;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
width: 16px;
height: 16px;
border-radius: 50%;
background: #333;
cursor: pointer;
}
.volume-container {
position: relative;
}
.volume-tooltip {
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: #333;
color: white;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
pointer-events: none;
opacity: 0;
transition: opacity 0.2s;
margin-bottom: 5px;
}
.volume-container:hover .volume-tooltip {
opacity: 1;
}
.sound-select {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 6px;
background: white;
color: black;
font-size: 13px;
margin-bottom: 8px;
}
.sound-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 8px;
margin: 4px 0;
background: #f9f9f9;
border-radius: 6px;
cursor: pointer;
}
.sound-item.active {
background: #e3f2fd;
border-left: 3px solid #2196f3;
}
.sound-item-left {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
}
.sound-check {
width: 18px;
height: 18px;
border-radius: 50%;
border: 2px solid #ccc;
display: inline-flex;
align-items: center;
justify-content: center;
}
.sound-item.active .sound-check {
background: #4caf50;
border-color: #4caf50;
color: white;
}
.sound-check:after {
content: "✓";
font-size: 12px;
display: none;
}
.sound-item.active .sound-check:after {
display: block;
}
.sound-name {
font-weight: 500;
}
.sound-type {
font-size: 10px;
padding: 2px 6px;
border-radius: 10px;
background: #e0e0e0;
}
.sound-gear {
cursor: pointer;
font-size: 14px;
padding: 4px;
}
.toggle-switch {
position: relative;
display: inline-block;
width: 44px;
height: 24px;
}
.toggle-switch input {
opacity: 0;
width: 0;
height: 0;
}
.toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: 0.3s;
border-radius: 24px;
}
.toggle-slider:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 3px;
bottom: 3px;
background-color: white;
transition: 0.3s;
border-radius: 50%;
}
input:checked + .toggle-slider {
background-color: #333;
}
input:checked + .toggle-slider:before {
transform: translateX(20px);
}
.test-btn {
width: 100%;
padding: 8px;
background: #333;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
margin-top: 8px;
}
.test-btn:hover {
background: #555;
}
.status-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 12px;
font-size: 11px;
font-weight: bold;
}
.status-active {
background: #4caf50;
color: white;
}
.status-inactive {
background: #f44336;
color: white;
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 20000;
display: flex;
align-items: center;
justify-content: center;
}
.modal-content {
background: white;
border-radius: 12px;
width: 400px;
max-width: 90%;
padding: 20px;
}
.modal-header {
font-size: 18px;
font-weight: bold;
margin-bottom: 16px;
padding-bottom: 10px;
border-bottom: 1px solid #ddd;
}
.modal-input {
width: 100%;
padding: 8px;
margin: 8px 0;
border: 1px solid #ddd;
border-radius: 6px;
}
.modal-select {
width: 100%;
padding: 8px;
margin: 8px 0;
border: 1px solid #ddd;
border-radius: 6px;
}
.modal-buttons {
display: flex;
gap: 10px;
margin-top: 16px;
}
.modal-btn {
flex: 1;
padding: 8px;
border: none;
border-radius: 6px;
cursor: pointer;
}
.modal-btn-save {
background: #333;
color: white;
}
.modal-btn-cancel {
background: #f0f0f0;
color: black;
}
.sound-list-container {
max-height: 200px;
overflow-y: auto;
margin: 10px 0;
}
.add-sound-btn {
width: 100%;
padding: 8px;
background: #f0f0f0;
border: 1px dashed #ccc;
border-radius: 6px;
cursor: pointer;
margin-top: 8px;
}
.delete-sound-btn {
color: #f44336;
cursor: pointer;
font-size: 12px;
margin-left: 8px;
}
</style>
<div class="panel-header">
<div class="panel-header-left">
<img class="panel-logo" src="https://images.seeklogo.com/logo-png/61/2/deepseek-ai-icon-logo-png_seeklogo-611473.png" alt="DeepSeek">
<div class="panel-title">DEEP SCREEN</div>
</div>
<button class="minimize-btn" id="minimizePanel">−</button>
</div>
<div class="settings-area">
<div class="setting-group">
<div class="setting-label">
<span>🔊 SISTEM DURUMU</span>
<span class="status-badge ${settings.enabled ? 'status-active' : 'status-inactive'}">
${settings.enabled ? 'AKTIF' : 'PASIF'}
</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="enableAlarm" ${settings.enabled ? 'checked' : ''}>
<span class="toggle-slider"></span>
</label>
</div>
<div id="dynamicSettings" style="display: ${settings.enabled ? 'block' : 'none'};">
<div class="setting-group">
<div class="setting-label">
<span>🔊 SES SEVIYESI</span>
<span id="volumeValue">${Math.round(settings.volume * 100)}%</span>
</div>
<div class="volume-container">
<input type="range" id="volumeControl" min="0" max="1" step="0.01" value="${settings.volume}">
<div class="volume-tooltip">🎛️ Fare tekerlegi ile ayarla</div>
</div>
</div>
<div class="setting-group">
<div class="setting-label">
<span>🎵 SES SEC</span>
<span class="gear-icon" id="openSoundModal">⚙️</span>
</div>
<div id="soundListContainer"></div>
</div>
<div class="setting-group">
<div class="setting-label">
<span>📝 BASLIK UYARISI</span>
<span class="gear-icon" id="openTitleModal">⚙️</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="titleAlert" ${settings.titleAlert ? 'checked' : ''}>
<span class="toggle-slider"></span>
</label>
</div>
<div class="setting-group">
<div class="setting-label">
<span>✨ ARKA PLAN EFEKTI</span>
</div>
<label class="toggle-switch">
<input type="checkbox" id="flashEffect" ${settings.flashEffect ? 'checked' : ''}>
<span class="toggle-slider"></span>
</label>
<div style="margin-top: 8px;">
<input type="color" id="flashColor" value="${settings.flashColor}" style="width: 100%;">
</div>
</div>
<button class="test-btn" id="testAlarm">🔔 TEST ALARM</button>
</div>
</div>
`;
document.body.appendChild(panel);
makeDraggable(panel);
attachPanelEvents();
refreshSoundList();
}
function refreshSoundList() {
const container = document.getElementById('soundListContainer');
if (!container) return;
const activeSound = getActiveSound();
container.innerHTML = soundList.map(sound => `
<div class="sound-item ${activeSoundId === sound.id ? 'active' : ''}" data-id="${sound.id}">
<div class="sound-item-left">
<div class="sound-check"></div>
<div class="sound-name">${sound.ad}</div>
<div class="sound-type">${sound.tur}</div>
</div>
<div class="sound-gear" data-action="edit" data-id="${sound.id}">⚙️</div>
</div>
`).join('');
container.querySelectorAll('.sound-item').forEach(el => {
el.addEventListener('click', (e) => {
if (e.target.classList.contains('sound-gear')) return;
const id = parseInt(el.dataset.id);
activeSoundId = id;
GM_setValue('activeSoundId', activeSoundId);
refreshSoundList();
});
const gear = el.querySelector('[data-action="edit"]');
if (gear) {
gear.addEventListener('click', (e) => {
e.stopPropagation();
const id = parseInt(gear.dataset.id);
openSoundEditModal(id);
});
}
});
}
function openSoundModal() {
const modal = document.createElement('div');
modal.className = 'modal';
modal.innerHTML = `
<div class="modal-content">
<div class="modal-header">🎵 SES YONETIMI</div>
<div class="sound-list-container" id="soundListModal"></div>
<button class="add-sound-btn" id="addNewSound">+ YENI SES EKLE</button>
<div class="modal-buttons">
<button class="modal-btn modal-btn-cancel" id="closeModal">KAPAT</button>
</div>
</div>
`;
document.body.appendChild(modal);
function refreshModalList() {
const container = modal.querySelector('#soundListModal');
container.innerHTML = soundList.map((sound, index) => `
<div class="sound-item" style="margin-bottom: 8px;">
<div class="sound-item-left" style="flex-direction: column; align-items: flex-start;">
<div><strong>${sound.ad}</strong> <span class="sound-type">${sound.tur}</span></div>
<div style="font-size: 10px; color: #666; word-break: break-all;">${sound.url.substring(0, 50)}...</div>
</div>
<div style="display: flex; gap: 5px;">
<span class="sound-gear" data-action="edit-modal" data-id="${sound.id}">✏️</span>
<span class="delete-sound-btn" data-action="delete" data-id="${sound.id}" data-index="${index}">🗑️</span>
</div>
</div>
`).join('');
container.querySelectorAll('[data-action="edit-modal"]').forEach(el => {
el.addEventListener('click', (e) => {
const id = parseInt(el.dataset.id);
modal.remove();
openSoundEditModal(id);
});
});
container.querySelectorAll('[data-action="delete"]').forEach(el => {
el.addEventListener('click', (e) => {
const id = parseInt(el.dataset.id);
if (soundList.length === 1) {
alert('En az bir ses kaydi olmalidir!');
return;
}
soundList = soundList.filter(s => s.id !== id);
if (activeSoundId === id) {
activeSoundId = soundList[0].id;
GM_setValue('activeSoundId', activeSoundId);
}
GM_setValue('soundList', soundList);
refreshModalList();
refreshSoundList();
});
});
}
modal.querySelector('#addNewSound').onclick = () => {
modal.remove();
openSoundEditModal(null);
};
modal.querySelector('#closeModal').onclick = () => modal.remove();
refreshModalList();
}
function openSoundEditModal(soundId) {
const isEdit = soundId !== null;
const sound = isEdit ? soundList.find(s => s.id === soundId) : null;
const modal = document.createElement('div');
modal.className = 'modal';
modal.innerHTML = `
<div class="modal-content">
<div class="modal-header">${isEdit ? '✏️ SES DUZENLE' : '➕ YENI SES EKLE'}</div>
<label>SES ADI</label>
<input type="text" class="modal-input" id="soundName" placeholder="Orn: ARINMA GECESI" value="${sound ? sound.ad : ''}">
<label>SES URL</label>
<input type="text" class="modal-input" id="soundUrl" placeholder="https://...mp3" value="${sound ? sound.url : ''}">
<label>SES TURU</label>
<select class="modal-select" id="soundType">
${soundTypes.map(t => `<option value="${t}" ${sound && sound.tur === t ? 'selected' : ''}>${t}</option>`).join('')}
</select>
<div class="modal-buttons">
<button class="modal-btn modal-btn-save" id="saveSound">KAYDET</button>
<button class="modal-btn modal-btn-cancel" id="cancelModal">IPTAL</button>
</div>
</div>
`;
document.body.appendChild(modal);
modal.querySelector('#saveSound').onclick = () => {
const ad = modal.querySelector('#soundName').value.trim();
const url = modal.querySelector('#soundUrl').value.trim();
const tur = modal.querySelector('#soundType').value;
if (!ad || !url) {
alert('Ses adi ve URL gereklidir!');
return;
}
if (isEdit) {
sound.ad = ad;
sound.url = url;
sound.tur = tur;
} else {
const newSound = {
id: Date.now(),
ad: ad,
url: url,
tur: tur
};
soundList.push(newSound);
if (!activeSoundId) activeSoundId = newSound.id;
}
GM_setValue('soundList', soundList);
GM_setValue('activeSoundId', activeSoundId);
refreshSoundList();
modal.remove();
};
modal.querySelector('#cancelModal').onclick = () => modal.remove();
}
function openTitleModal() {
const modal = document.createElement('div');
modal.className = 'modal';
modal.innerHTML = `
<div class="modal-content">
<div class="modal-header">📝 BASLIK UYARISI DUZENLE</div>
<label>1. METIN (yanip sonen)</label>
<input type="text" class="modal-input" id="titleText1" value="${settings.titleText.replace(/"/g, '"')}">
<label>2. METIN (yanip sonen)</label>
<input type="text" class="modal-input" id="titleText2" value="${settings.titleText2.replace(/"/g, '"')}">
<label>Emoji secenekleri:</label>
<div style="display: flex; gap: 8px; flex-wrap: wrap; margin: 8px 0;">
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">🔴</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">🚨</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">⚠️</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">🔔</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">⛔</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">❗</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">❌</span>
<span style="cursor: pointer; font-size: 20px;" class="emoji-picker">🔥</span>
</div>
<div class="modal-buttons">
<button class="modal-btn modal-btn-save" id="saveTitle">KAYDET</button>
<button class="modal-btn modal-btn-cancel" id="cancelModal">IPTAL</button>
</div>
</div>
`;
document.body.appendChild(modal);
modal.querySelectorAll('.emoji-picker').forEach(emoji => {
emoji.onclick = () => {
const input = document.activeElement;
if (input && (input.id === 'titleText1' || input.id === 'titleText2')) {
input.value += emoji.textContent;
}
};
});
modal.querySelector('#saveTitle').onclick = () => {
settings.titleText = modal.querySelector('#titleText1').value;
settings.titleText2 = modal.querySelector('#titleText2').value;
GM_setValue('titleText', settings.titleText);
GM_setValue('titleText2', settings.titleText2);
modal.remove();
};
modal.querySelector('#cancelModal').onclick = () => modal.remove();
}
function makeDraggable(element) {
let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
const header = element.querySelector('.panel-header');
header.onmousedown = dragMouseDown;
function dragMouseDown(e) {
if (e.target.classList.contains('minimize-btn')) return;
e.preventDefault();
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
document.onmousemove = elementDrag;
}
function elementDrag(e) {
e.preventDefault();
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
element.style.top = (element.offsetTop - pos2) + "px";
element.style.left = (element.offsetLeft - pos1) + "px";
element.style.right = "auto";
}
function closeDragElement() {
document.onmouseup = null;
document.onmousemove = null;
}
}
function attachPanelEvents() {
const minimizeBtn = document.getElementById('minimizePanel');
const panel = document.getElementById('deep-screen-panel');
const dynamicSettings = document.getElementById('dynamicSettings');
minimizeBtn.onclick = () => {
panel.classList.toggle('minimized');
minimizeBtn.textContent = panel.classList.contains('minimized') ? '+' : '−';
};
const volumeSlider = document.getElementById('volumeControl');
if (volumeSlider) {
volumeSlider.oninput = (e) => {
settings.volume = parseFloat(e.target.value);
GM_setValue('volume', settings.volume);
document.getElementById('volumeValue').textContent = `${Math.round(settings.volume * 100)}%`;
if (currentAudio) currentAudio.volume = settings.volume;
};
volumeSlider.addEventListener('wheel', (e) => {
e.preventDefault();
let newVal = settings.volume + (e.deltaY > 0 ? -0.05 : 0.05);
newVal = Math.min(1, Math.max(0, newVal));
settings.volume = newVal;
GM_setValue('volume', settings.volume);
volumeSlider.value = settings.volume;
document.getElementById('volumeValue').textContent = `${Math.round(settings.volume * 100)}%`;
if (currentAudio) currentAudio.volume = settings.volume;
});
}
document.getElementById('enableAlarm').onchange = (e) => {
settings.enabled = e.target.checked;
GM_setValue('enabled', settings.enabled);
dynamicSettings.style.display = settings.enabled ? 'block' : 'none';
const badge = document.querySelector('.status-badge');
badge.className = `status-badge ${settings.enabled ? 'status-active' : 'status-inactive'}`;
badge.textContent = settings.enabled ? 'AKTIF' : 'PASIF';
if (!settings.enabled && isAlerting) stopAlert();
};
const flashEffectCheck = document.getElementById('flashEffect');
if (flashEffectCheck) {
flashEffectCheck.onchange = (e) => {
settings.flashEffect = e.target.checked;
GM_setValue('flashEffect', settings.flashEffect);
};
}
const flashColorPicker = document.getElementById('flashColor');
if (flashColorPicker) {
flashColorPicker.onchange = (e) => {
settings.flashColor = e.target.value;
GM_setValue('flashColor', settings.flashColor);
};
}
const titleAlertCheck = document.getElementById('titleAlert');
if (titleAlertCheck) {
titleAlertCheck.onchange = (e) => {
settings.titleAlert = e.target.checked;
GM_setValue('titleAlert', settings.titleAlert);
};
}
const testBtn = document.getElementById('testAlarm');
if (testBtn) {
testBtn.onclick = () => {
if (isAlerting) {
stopAlert();
setTimeout(() => startAlert(true), 100);
} else {
startAlert(true);
setTimeout(() => stopAlert(), 3000);
}
};
}
const openSoundModalBtn = document.getElementById('openSoundModal');
if (openSoundModalBtn) openSoundModalBtn.onclick = () => openSoundModal();
const openTitleModalBtn = document.getElementById('openTitleModal');
if (openTitleModalBtn) openTitleModalBtn.onclick = () => openTitleModal();
}
function playSound() {
if (!isAlerting) return;
const activeSound = getActiveSound();
if (currentAudio) {
currentAudio.pause();
currentAudio.currentTime = 0;
}
currentAudio = new Audio(activeSound.url);
currentAudio.volume = settings.volume;
currentAudio.loop = true;
currentAudio.play().catch(e => console.log('[Deep Screen] Ses hatası:', e));
}
function stopSound() {
if (currentAudio) {
currentAudio.pause();
currentAudio.currentTime = 0;
currentAudio = null;
}
}
function startAlert(isTest = false) {
if (!settings.enabled && !isTest) return;
if (isAlerting) return;
isAlerting = true;
console.log('[Deep Screen] 🚨 ALARM AKTIF! 🚨');
if (!isTest) playSound();
else {
const activeSound = getActiveSound();
const testAudio = new Audio(activeSound.url);
testAudio.volume = settings.volume;
testAudio.play().catch(e => console.log('Test ses hatası:', e));
}
if (settings.flashEffect) {
let flashCount = 0;
flashInterval = setInterval(() => {
if (!isAlerting) {
clearInterval(flashInterval);
return;
}
document.body.style.backgroundColor = flashCount++ % 2 === 0 ? settings.flashColor : '#ffffff';
}, 300);
}
if (settings.titleAlert && !isTest) {
let titleCount = 0;
const titleInterval = setInterval(() => {
if (!isAlerting) {
clearInterval(titleInterval);
return;
}
document.title = titleCount++ % 2 === 0 ? settings.titleText : settings.titleText2;
}, 500);
}
}
function stopAlert() {
if (!isAlerting) return;
isAlerting = false;
stopSound();
if (flashInterval) {
clearInterval(flashInterval);
flashInterval = null;
}
document.body.style.backgroundColor = '';
document.title = 'DeepSeek Chat';
console.log('[Deep Screen] Alarm durduruldu');
}
function checkButton() {
const btn = document.querySelector('div._8e85838 button');
if (!btn) {
if (isAlerting) stopAlert();
return;
}
const span = btn.querySelector('span');
if (!span || span.textContent !== 'Continue') {
if (isAlerting) stopAlert();
return;
}
if (!isAlerting && settings.enabled) startAlert();
}
const observer = new MutationObserver(() => checkButton());
observer.observe(document.body, { childList: true, subtree: true });
setInterval(checkButton, 500);
checkButton();
setTimeout(createPanel, 1000);
console.log('[Deep Screen] Script başarıyla yüklendi!');
})();