#NoEnv
#SingleInstance, Force
#Persistent
Menu, Tray, Tip, % "Ответы на викторину для Pentacraft"
Menu, Tray, add, Инструкция, about
Menu, Tray, add, Закрыть, GuiClose
Menu, Tray, NoStandard
global version := 2
if (curl("POST", "https://fforest.pro/version.php", {art: "versionAns"}) > version)
Download_NewVersion("https://fforest.pro/other/AnswerForPentacraft.exe", A_ScriptName)
global mainPach := ""
global autoSend := ""
global server := ["Galaxy", "Lite", "Evo", "Trie", "Sky", "MagicRPG", "Hard", "Epsilon"]
ToolTip, % "Поиск окна Pentacraft: Это не то окно." , 7, 0
SerchScreenPenta()
global chatLog := new LogRead(mainPach, 0)
global _timer := 600
global timer := _timer
calc := ComObjCreate("ScriptControl")
calc.Language := "VBScript"
SetTimer, Chat, 150
SetTimer, Timer, 1000
return
Chat:
messages := chatLog.getLastStr()
for k, v in messages
{
if (RegExMatch(v, "\[Викторина\] Первый игрок, решивший (.*) (\+|\-|\*|\/) (.*), выиграет .* монет.", chattext))
{
timer := _timer
SoundBeep
result := calc.Eval(chattext1 " " chattext2 " " chattext3)
output := "| Ответ: " result
copy(result)
if (autoSend)
autoSender()
}
else if (RegExMatch(v, "\[Викторина\] Первый игрок, правильно ответивший на вопрос ниже, выиграет .* монет.") && RegExMatch(messages[k + 1], "\[CHAT\] (.*)", out_pars))
{
RegExMatch(curl("GET", "https://baza-otvetov.ru/search/view/?q=" out_pars1), "U)<h3><span>Вопрос: <\/span>.*<\/h3>\s+<h3><span>Ответ: <\/span>(.*)<\/h3>", out)
output := "| " (result ? "Ответ: " out1 : "Ответ не найден")
copy(out1)
if (autoSend)
autoSender()
}
}
Return
Timer:
WinGetTitle, title, A
if (timer > 0)
timer--
WinGetPos,,, Width, Height, A
if (RegExMatch(title, "Pentacraft .* \[1.7.10\]"))
ToolTip, % "Осталось до викторины: " times(timer) " " output, 7, 0
else
ToolTip
Return
times(sec)
{
h := sec/3600 ^ 0
m := (sec-h*3600)/60 ^ 0
s := sec-h*3600-m*60
return (m < 10 ? "0" m : m) " мин. " (s < 10 ? "0" s : s) " сек."
}
SerchScreenPenta()
{
While(True)
{
WinGetTitle, title, A
if (RegExMatch(title, "Pentacraft\s+(?<Server>.*)\s+\[.*\]\s+\[.*\]", out) && searchInArray(outServer, server))
{
for Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process where Name='javaw.exe'")
RegExMatch(process.ExecutablePath, "(?<Pach>.*)\\.*\\bin\\javaw\.exe", out)
pach := outPach "\" outServer "\logs\latest.log"
if (FileExist(pach))
{
mainPach := pach
Break
}
pach := outPach "\" outServer "-Shaders\logs\latest.log"
if (FileExist(pach))
{
mainPach := pach
Break
}else{
MsgBox, 0x10, Ошибка, % "Не удалось найти путь.`nОбратитесь к разработчику скрипта за помощью.`n" pach
ToolTip
}
}
}
}
GuiClose:
ExitApp
return
about:
MsgBox,, Инструкция, % "Об скрипте`nСкрипт был сделать для фарма местной валюты.`nДанный скрипт имеет 99% ответ на все вопросы викторины.`nСКРИПТ НЕ ДЛЯ ПРОДАЖИn`n`nИнструкция`n1)Запустить Ваш сервер PentaCraft.`n2)Запустить скрипт`n2.1)Если у вас путь уже установлен тогда вы молодцы :D`n2.2)При первом запуске скрипт предложит указать путь к логам`n--По умолчанию лог находится: --C:\Users\ИМЯ_ПК\Pentacraft\updates\СЕРВЕР\logs`n--Если Вы уже указали путь, и он не верный, вы можете его --изменить нажав ПКМ на иконку в трее -> Настройки.`n3)С вверху должен появится таймер, если он есть тогда вы сделали --всё верно.`n4)Как только викторина объявится в чат поступит звуковое --оповещение, и с сверху покажет возможный ответ на вопрос.`n--Так же ответ с копируется в буфер обмена, это значит что можно --открыть чат и нажать сочетание клавиш Ctrl + V`n"
return
searchInArray(param, arr)
{
for key, value in arr
if (value == param)
Return True
Return False
}
Copy(Text, LocaleID=0x419)
{
CF_TEXT:=1, CF_LOCALE:=16, GMEM_MOVEABLE:=2
TextLen :=StrLen(Text)
HmemText :=DllCall("GlobalAlloc", "UInt", GMEM_MOVEABLE, "UInt", TextLen+1)
HmemLocale:=DllCall("GlobalAlloc", "UInt", GMEM_MOVEABLE, "UInt", 4)
If(!HmemText || !HmemLocale)
Return
PtrText :=DllCall("GlobalLock", "UInt", HmemText)
PtrLocale :=DllCall("GlobalLock", "UInt", HmemLocale)
DllCall("msvcrt\memcpy", "UInt", PtrText, "Str", Text, "UInt", TextLen+1, "Cdecl")
NumPut(LocaleID, PtrLocale+0)
DllCall("GlobalUnlock", "UInt", HmemText)
DllCall("GlobalUnlock", "UInt", HmemLocale)
If not DllCall("OpenClipboard", "UInt", 0)
{
DllCall("GlobalFree", "UInt", HmemText)
DllCall("GlobalFree", "UInt", HmemLocale)
Return
}
DllCall("EmptyClipboard")
DllCall("SetClipboardData", "UInt", CF_TEXT, "UInt", HmemText)
DllCall("SetClipboardData", "UInt", CF_LOCALE, "UInt", HmemLocale)
DllCall("CloseClipboard")
}
Download(url, file, callback) {
static vt
if !VarSetCapacity(vt) {
VarSetCapacity(vt, A_PtrSize*11), nPar := "31132253353"
Loop Parse, nPar
NumPut(RegisterCallback("DL_Progress", "F", A_LoopField, A_Index-1), vt, A_PtrSize*(A_Index-1))
}
if !(IsObject(callback) || (callback := Func(callback)))
return !(ErrorLevel := 1)
VarSetCapacity(bobj, A_PtrSize*2), NumPut(&callback, NumPut(&vt, bobj)), VarSetCapacity(tn, 520)
if (0 = DllCall("urlmon\URLDownloadToCacheFile", "ptr", 0, "str", url, "str", tn, "uint", 260, "uint", 0x10, "ptr", &bobj))
FileCopy %tn%, %file%, 1
else
ErrorLevel := 1
return !ErrorLevel
}
DL_Progress( pthis, nP=0, nPMax=0, nSC=0, pST=0 ) {
if A_EventInfo = 6
fn := Object(NumGet(pthis+A_PtrSize)), %fn%(np, npMax)
return 0
}
Download_NewVersion_Progress(n, nMax) {
if !nMax
return
width := (n*100/nMax)
GuiControl,Download:, DownProgress, % width
Size := DownloadSize(n) " / " DownloadSize(nMax)
GuiControl,Download:Text ,DownProgressSize, % Size
Sleep 10
}
DownloadSize(n) {
n /= 1024
if (n > 1024)
return Round(n/1024, 2) " MB"
return Round(n, 2) " KB"
}
Download_NewVersion(url_script,filename) {
global wb
wb.Stop()
file := A_ScriptDir "\" filename "_new"
Oldfile := A_ScriptDir "\" filename
Sleep 10
if !Download(url_script, file, "Download_NewVersion_Progress") {
msg.internet()
return
}
FileGetSize, sizeofnew, %file%
if (file > 300000)
Run, %comspec% /c ping -n 4 127.0.0.1 >nul && copy /Y "%file%" "%Oldfile%" && "%Oldfile%", , hide
else
{
msg.internet()
}
ExitApp
}
curl(method, adress, package := "", user_agent := "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36 u01-05", error_log := 0, time_out := 0)
{
if (GetOSVersion() == 7)
{
RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp, DefaultSecureProtocols, 2560
RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp, DefaultSecureProtocols, 2560
}
if (!RegExMatch(adress, "^http[s]?:\/\/.*\..*$"))
return error_log ? "Invalid URL adress (#1)" : false
else if (!DllCall("Wininet.dll\InternetGetConnectedState", "Str", 0x20, "Int", 0))
return error_log ? "Not internet connection (#2)" : false
try
{
temp_package := ""
for k, v in package
temp_package .= (A_Index > 1 ? "&" : (method == "POST" ? "" : "?")) k "=" (IsObject(v) ? JSON.Encode(v) : v)
http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
http.Open(method, adress (method != "POST" ? temp_package : ""), false)
http.SetRequestHeader("Referer", adress)
http.SetRequestHeader("User-Agent", user_agent)
http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
http.SetRequestHeader("Pragma", "no-cache")
http.SetRequestHeader("Cache-Control", "no-cache, no-store")
http.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
http.Send((method == "POST" ? temp_package : ""))
http.WaitForResponse(time_out ? time_out : 0)
if (!StrLen(http.ResponseText))
return error_log ? "Empty response (#3)" : false
else
{
if (http.Status !== 200)
return error_log ? http.Status "(" http.StatusText ") (#4)" : false
else
{
ResponseText := RegExReplace(http.ResponseText, "<br>", "`n")
ResponseText := RegExReplace(ResponseText, "<t>", "`t")
ResponseText := RegExReplace(ResponseText, "<br \/>", "`n")
return ResponseText
}
}
}
catch e
return error_log ? e.message "(#5)" : false
}
GetOSVersion()
{
VarSetCapacity(v,148), NumPut(148,v)
DllCall("GetVersionEx", "uint", &v)
os := NumGet(v,4) "." NumGet(v,8) "." SubStr("0000" NumGet(v,12), -3)
if (RegExMatch(os, "^(\d+)\.(\d+)", out_pars))
{
if (out_pars1 == 10)
Return 10
else if (out_pars1 == 6 && out_pars2 > 1)
Return 8
}
Return 7
}
class LogRead
{
__New(LogWay)
{
this.LogWay := LogWay
this.sizeLast := 0
}
getLastStr()
{
FileGetSize, fileSize, % this.LogWay
if(fileSize <= this.sizeLast || this.sizeLast == 0)
{
this.sizeLast := fileSize
Return
}
file := FileOpen(this.LogWay, "r")
file.Seek(this.sizeLast)
fileText := file.Read()
file.Close()
this.sizeLast := fileSize
Return StrSplit(fileText, "`r`n")
}
}