// ----------------------------------------- // Script created by Alexey Pikurov // hobit@nsoft-s.com // history versions // ----------------------------------------- // v1, Sep 15, 2018 // GeoIP // ----------------------------------------- // v2, Jun 25, 2019 // курсы валют USD и EUR к UAH // ----------------------------------------- const BOT_VERSION = '2'; BOT_RELEASE_DATE = 'Jun 25, 2019'; IP_ADDRESS_REGEXP = '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'; // https://index.minfin.com.ua/reference/currency/code/ CURRENCY_USD = 840; CURRENCY_EUR = 978; CURRENCY_UAH = 980; var bFlag: boolean; sReplyText: string; function GetGeoIPInfo(sIP: string): boolean; var sCountry, sTown, s: string; begin if RegExpIsMatch(sIP, IP_ADDRESS_REGEXP) then begin SetScriptTimeOut(10000); s := GeoIPGetQuickInfo(sIP); if length(s) = 0 then sReplyText := 'IP: ' + sIP + CRLF + 'unknown IP address (maybe local?)' else begin sCountry := Fetch(s, '|'); sTown := s; if length(sTown) > 0 then sTown := ', ' + sTown; sReplyText := 'IP: ' + sIP + CRLF + sCountry + sTown; end; result := true; end else result := false; end; function GetExchangeRates(sCmd: string): boolean; // https://api.monobank.ua/docs/ var s, sUSD, sEUR, sJSON, sRateBuy, sRateSell: string; i, iCount, iCodeA, iCodeB: integer; begin s := LowerCase(sCmd); if (s = 'curs') or (s = 'курс') or (s = 'курсы') or (s = 'курсы валют') or (s = 'валюта') or (s = 'доллар') or (s = 'евро') or (s = 'бакс') or (s = 'курс доллара') or (s = 'курс евро') or (s = 'currency') or (s = 'exchange') or (s = 'exchange rates') or (s = 'usd') or (s = 'eur') then begin result := true; s := mHTTPSendGetMessage('https://api.monobank.ua/bank/currency', '', 2000); iCount := JSONArrayLength(s); if iCount > 0 then for i := 0 to iCount - 1 do if JSONArrayGetString(s, i, sJSON) = 0 then if (JSONGetInteger(sJSON, 'currencyCodeA', iCodeA) = 0) and (JSONGetInteger(sJSON, 'currencyCodeB', iCodeB) = 0) then if iCodeB = CURRENCY_UAH then begin JSONGetString(sJSON, 'rateBuy', sRateBuy); JSONGetString(sJSON, 'rateSell', sRateSell); case iCodeA of CURRENCY_USD: sUSD := sRateBuy + ' / ' + sRateSell; CURRENCY_EUR: sEUR := sRateBuy + ' / ' + sRateSell; end; end; sReplyText := 'Курсы валют, покупка/продажа:' + CRLF + '------------------------------' + CRLF + '$ : ' + sUSD + CRLF + '€ : ' + sEUR; end; end; procedure BotHelp; begin sReplyText := '-=Elisa Bot=-' + CRLF + 'v.' + BOT_VERSION + ' / ' + BOT_RELEASE_DATE + CRLF + CRLF + '? - справка по командам' + CRLF + ' - узнать страну и город по адресу IPv4' + CRLF + '"курс", "валюта", ... - курсы валют USD и EUR к гривне'; end; function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean; var sCmd: string; begin bFlag := true; sReplyText := ''; // если получатель сообщения - встроенный робот Elisa с UIN = 0 if iUINTo = 0 then begin // получить текст команды sCmd := UpperCase(mConvertMsgToPlainText(sMsg, iMsgType)); if GetExchangeRates(sCmd) then bFlag := false else if GetGeoIPInfo(sCmd) then bFlag := false // если это IP-адрес else begin BotHelp; // показываем справку bFlag := false; end; end; // если команда была обработана, то "гасим" исходное сообщение // и отправляем новое, от имени встроенного бота Elisa с UIN = 0 if not bFlag then mSendPrivateMessage(0, iUIN, sReplyText, 1, true); result := bFlag; end; begin end.