Auto click items to search in Dead Frontier market
// ==UserScript==
// @name DF Quick Search
// @namespace http://tampermonkey.net/
// @version 1.4
// @description Auto click items to search in Dead Frontier market
// @author SHUN
// @license SHUN
// @match *://fairview.deadfrontier.com/onlinezombiemmo/*
// @match *://*.deadfrontier.com/onlinezombiemmo/*
// @grant none
// @icon https://i.imgur.com/wDmstST.png
// @run-at document-end
// DF Quick Search
// ==/UserScript==
(function() {
'use strict';
console.log('DF Quick Search script started');
// Wait for page load
setTimeout(init, 2000);
function init() {
const isMarketPage = window.location.href.includes('page=35');
console.log('Market page:', isMarketPage);
// Only activate features on market page
if (isMarketPage) {
console.log('Enabling auto-search features');
setupRightClickSearch();
setupDoubleClickSearch();
setupSearchBoxListener();
addInstructions(); // Add instructions only on market page
} else {
console.log('Not market page - script inactive');
return;
}
}
// Setup right-click function (market page only)
function setupRightClickSearch() {
document.addEventListener('contextmenu', function(e) {
const itemElement = findItemElement(e.target);
if (!itemElement) return;
e.preventDefault();
const itemInfo = extractItemInfo(itemElement);
if (itemInfo && itemInfo.name) {
console.log('Right-click item:', itemInfo.name);
autoSearchInMarket(itemInfo.name);
}
});
}
// Setup double-click function (market page only)
function setupDoubleClickSearch() {
document.addEventListener('dblclick', function(e) {
const itemElement = findItemElement(e.target);
if (!itemElement) return;
const itemInfo = extractItemInfo(itemElement);
if (itemInfo && itemInfo.name) {
console.log('Double-click item:', itemInfo.name);
autoSearchInMarket(itemInfo.name);
}
});
}
// Setup search box listener (market page only)
function setupSearchBoxListener() {
setInterval(() => {
const searchBox = findSearchBox();
if (searchBox) {
searchBox.setAttribute('data-autosearch', 'enabled');
searchBox.title = 'Auto-search enabled (Click items to auto-fill)';
}
}, 1000);
}
// Find item element
function findItemElement(element) {
if (element.classList && (
element.classList.contains('item') ||
element.classList.contains('fakeItem') ||
element.parentElement?.classList?.contains('fakeItem')
)) {
return element.classList.contains('item') ? element : element.parentElement;
}
let current = element;
while (current && current !== document.body) {
if (current.classList && (
current.classList.contains('item') ||
current.classList.contains('fakeItem')
)) {
return current;
}
current = current.parentElement;
}
return null;
}
// Extract item information
function extractItemInfo(itemElement) {
try {
if (itemElement.dataset.type) {
const itemId = itemElement.dataset.type;
const itemName = getItemNameFromId(itemId);
return {
id: itemId,
name: itemName
};
}
const textElements = itemElement.querySelectorAll('.itemName, .item-name, .name');
for (const elem of textElements) {
if (elem.textContent && elem.textContent.trim()) {
return {
name: elem.textContent.trim()
};
}
}
if (itemElement.textContent && itemElement.textContent.trim()) {
const text = itemElement.textContent.trim();
const cleanName = cleanItemName(text);
if (cleanName) {
return { name: cleanName };
}
}
return null;
} catch (e) {
console.error('Extract item info failed:', e);
return null;
}
}
// Get item name from ID
function getItemNameFromId(itemId) {
if (window.globalData && window.globalData[itemId]) {
return window.globalData[itemId].name || itemId;
}
return itemId;
}
// Clean item name
function cleanItemName(text) {
const patterns = [
/\$[\d,]+/g,
/\d+\s*x\s*\d+/g,
/\([^)]+\)/g,
/\[[^\]]+\]/g,
/\d+$/g,
/buy$/i,
/sell$/i,
/\s+/g
];
let cleaned = text;
patterns.forEach(pattern => {
cleaned = cleaned.replace(pattern, ' ');
});
cleaned = cleaned.trim();
return cleaned.length > 2 ? cleaned : text.trim();
}
// Find search box
function findSearchBox() {
const selectors = [
'input[name="searchField"]',
'input[id*="search"]',
'input[placeholder*="Search"]',
'input[placeholder*="search"]',
'input[type="text"]',
'input[type="search"]',
'#searchField',
'.searchField',
'input[name*="search"]'
];
for (const selector of selectors) {
const element = document.querySelector(selector);
if (element && element.tagName === 'INPUT') {
return element;
}
}
return null;
}
// Auto search in market
function autoSearchInMarket(itemName) {
console.log('Searching:', itemName);
const searchBox = findSearchBox();
if (!searchBox) {
console.log('Search box not found');
showNotification(`Search box not found: ${itemName}`, 'warning');
copyToClipboard(itemName);
return;
}
searchBox.value = itemName;
triggerEvents(searchBox);
clickSearchButton();
showNotification(`Searching: ${itemName}`, 'success');
}
// Trigger input events
function triggerEvents(inputElement) {
const events = ['input', 'change', 'keyup', 'keydown'];
events.forEach(eventType => {
inputElement.dispatchEvent(new Event(eventType, {
bubbles: true,
cancelable: true
}));
});
}
// Click search button
function clickSearchButton() {
const buttons = document.querySelectorAll('button, input[type="submit"], input[type="button"]');
for (const button of buttons) {
const btnText = (button.textContent || button.value || '').toLowerCase();
const btnId = (button.id || '').toLowerCase();
const btnName = (button.name || '').toLowerCase();
if (btnText.includes('search') ||
btnText.includes('find') ||
btnText.includes('go') ||
btnId.includes('search') ||
btnName.includes('search')) {
setTimeout(() => {
button.click();
console.log('Clicked search button');
}, 300);
return true;
}
}
const searchBox = findSearchBox();
if (searchBox) {
const form = searchBox.closest('form');
if (form) {
setTimeout(() => {
form.submit();
console.log('Form submitted');
}, 300);
return true;
}
}
return false;
}
// Copy to clipboard
function copyToClipboard(text) {
try {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
console.log('Copied to clipboard:', text);
} catch (e) {
console.error('Copy failed:', e);
}
}
// Show notification (center top)
function showNotification(message, type) {
const oldNotification = document.getElementById('df-auto-search-notification');
if (oldNotification) oldNotification.remove();
const notification = document.createElement('div');
notification.id = 'df-auto-search-notification';
notification.textContent = message;
notification.style.cssText = `
position: fixed !important;
top: 20px !important;
left: 50% !important;
transform: translateX(-50%) !important;
padding: 12px 20px !important;
background-color: ${type === 'success' ? '#28a745' : '#ff9900'} !important;
color: white !important;
border-radius: 5px !important;
z-index: 10000 !important;
box-shadow: 0 3px 15px rgba(0,0,0,0.4) !important;
font-weight: bold !important;
animation: fadeInOut 3s forwards !important;
white-space: nowrap !important;
text-align: center !important;
`;
const style = document.createElement('style');
style.textContent = `
@keyframes fadeInOut {
0% { opacity: 0; transform: translateX(-50%) translateY(-20px); }
10% { opacity: 1; transform: translateX(-50%) translateY(0); }
90% { opacity: 1; transform: translateX(-50%) translateY(0); }
100% { opacity: 0; transform: translateX(-50%) translateY(-20px); }
}
`;
document.head.appendChild(style);
document.body.appendChild(notification);
setTimeout(() => notification.remove(), 3000);
}
// Add instructions ONLY on market page
function addInstructions() {
const instructions = document.createElement('div');
instructions.innerHTML = `
<div style="
position: fixed;
bottom: 10px;
right: 10px;
background: rgba(0,0,0,0.8);
color: white;
padding: 10px;
border-radius: 5px;
font-size: 12px;
z-index: 9998;
max-width: 200px;
border: 1px solid #ff9900;
">
<strong>🔍 Auto Search</strong><br>
• Right-click item: Auto search<br>
• Double-click item: Auto search<br>
• Item name auto-fills search box
</div>
`;
document.body.appendChild(instructions);
// Auto hide after 10 seconds
setTimeout(() => {
instructions.style.opacity = '0.5';
instructions.style.cursor = 'pointer';
instructions.onclick = () => instructions.remove();
}, 10000);
}
})();