Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Помощь по скриптам для PtokaX _ скрипт рекордов АПИ1

Автор: степашка 26.4.2009, 20:53

здравствуйте. есть скрипт рекордов. работает безупречно. есть только одно нарекание. отображает рекорды по-идиотски:
-------------------------------------------------------------------
Рекорд Значение Дата - Время
-------------------------------------------------------------------
Шара 287 ТБ 04/26/09 18:13:24
Юзеры 2298 чел. 04/26/09 18:13:24
Макс. шара ((I)))Berserk (14.0 ТБ)
-------------------------------------------------------------------
т.е. дата отображается как месяц - число - год. возможно ли сделать чтоб отображалось так?:
Шара 287 ТБ 26 апреля 2009; 18:13:24
Юзеры 2298 чел. 26 апреля 2009; 18:13:24
Я читал про захваты и прочее, но не понял ничего ))) там сложно слишком для меня. Спасибо кто поможет

 RecordBot.lua ( 8.79 килобайт ) : 10
 

Автор: district 27.4.2009, 0:05

Можно вот в таком стандартном формате : 24 Jan 2009 22:31
Без секунд :

Код
os.date("%d %b %Y %H:%M")

С секундами :
Код
os.date("%d %b %Y %H:%M:%S")


Код
os.date()
меняем на форматированную дату, там всего
два раза, если не ошибаюсь, в скрипте встречается.

Автор: степашка 27.4.2009, 8:14

спасибо щас попробую )) \\\ спасибо всё работает. прилагаю если кому понадобится ) \\\
а на русском месяцы реально сделать? пытался прикрутить из ТаймДата-бота (прилагаю), но постоянные ошибки или вообще ничего не показывает

 RecordBot.lua ( 8.83 килобайт ) : 6
 TimeDateBot.lua ( 4.76 килобайт ) : 5
 

Автор: district 4.5.2009, 5:40

Самым примитивным решением, видимо, будет аргументировать полученную строку даты в функцию замены импортных названий месяцев на русские названия. Например, так :
вместо

Код
os.date("%d %b %Y %H:%M")
пишем
Код
GsubMonth(os.date("%d %b %Y %H:%M"))
и добавляем функцию :
Код
function GsubMonth(s)
s=s:gsub("Jan","Января"); s=s:gsub("Mar","Марта"); s=s:gsub("May","Мая")
s=s:gsub("Jun","Июня"); s=s:gsub("Jul","Июля"); s=s:gsub("Aug","Августа")
s=s:gsub("Feb","Февраля"); s=s:gsub("Sep","Сентября"); s=s:gsub("Dec","Декабря")
s=s:gsub("Oct","Октября"); s=s:gsub("Nov","Ноября"); s=s:gsub("Apr","Апреля")
return s
end

Автор: Setuper 4.5.2009, 13:40

В данном случае это не оптимальное решение, так как метод gsub будет при каждом вызове функции выполняться всегда 12 раз. Кроме этого, использование такого количества локальных строк будет влиять на скачки в памяти при каждом использовании данной функции.

Лучше сделать локальную таблицу с месяцами:

Код
local sM, tMonth = "%b", {
  Jan = "Января",
  Feb = "Февраля",
  Mar = "Марта",
  Apr = "Апреля",
  May = "Мая",
  Jun = "Июня",
  Jul = "Июля",
  Aug = "Августа",
  Sep = "Сентября",
  Oct = "Октября",
  Nov = "Ноября",
  Dec = "Декабря"
}

function GetMonth()
  return tMonth[os.date(sM)]
end


Тогда использование будет таким:
Код
os.date("%d %%s %Y %H:%M"):format(GetMonth())

Автор: district 4.5.2009, 15:00

Setuper
А где можно почитать об использовании format ?

Автор: Setuper 4.5.2009, 15:28

В данном случае метод формат используется в качестве оптимизации и сокращения выделяемой памяти.
Можно было написать так:

Код
os.date("%d "..GetMonth().." %Y %H:%M")
но если мы так напишем, то 1 байт выделится под строку "%d ", и 1 байт выделится под строку " %Y %H:%M", после этого они конкатенацией соединятся. В итоге получаем выделение памяти под строки в размере 2 байт - это мусор, который надо будет позже убирать.

В случае если же мы напишем так:
Код
os.date("%d %%s %Y %H:%M"):format(GetMonth())
то выделится всего 1 байт под строку "%d %%s %Y %H:%M", после чего в этой строке произойдёт замена %s на значение нашей функции GetMonth. В итоге получаем выделение памяти под строки в размере 1 байта.

В общем метод format, в данном случае, используется для форматирования строки, в частности для замены %s на то, что мы хотим, с целью сокращения выделения памяти под мусор.

И ещё... Так как перед форматированием строки мы используем функцию os.date, которая также работает с переменными содержащими знак процента, то если написать не %%s, а %s, то функция os.date преобразует этот %s в своё выражение, для того, чтобы этого не произошло нам нужно, чтобы на выходе после функции os.date знак процента сохранился, то есть нам надо экранировать знак процента, что я и делаю тут.

Почитать про format можно тут: http://mydc.ru/r/?http://www.lua.ru/doc/5.4.html

Автор: степашка 4.5.2009, 18:55

весьма благодарен за ваше участие )))
однако пытался вставить то что вы тут написали, результат ноль.
можно сюда скрипт полностью? это только вам легко понять сии премудрости (((

Автор: skonda 8.5.2009, 22:13

Цитата(степашка @ 4.5.2009, 19:55) *
весьма благодарен за ваше участие )))
однако пытался вставить то что вы тут написали, результат ноль.
можно сюда скрипт полностью? это только вам легко понять сии премудрости (((
присоединяюсь к просьбе. у кого после всех этих преобразований есть рабочий скрипт под API1 просьба выложить

Автор: district 9.5.2009, 3:41

Ну что же вы так, ребята? Задачка то простая совсем - готовое решение в скрипт вписать. Каждый одминчег должен стать Всадником Птокапокалипсиса, и Lua Reference Manual - Библия Его, и NotePad ++ - копье Его big_smile1.gif
Приписал решение Setuper'a в выложенный скрипт, пользуйтесь...
Попутно вот, смотрите. При показе в гл. чате рекорды форматируются. В зависимости от конкретных текщих значений может потребоваться добавление-удаление символов табуляции ( \t) в строках

Код
msg = msg.."\tШара\t\t"..DoShareUnits((Record.Share)).." \t\t\t"..Record.tShare.."\r\n"
msg = msg.."\tЮзеры\t\t"..Record.Users.." чел.\t\t\t"..Record.tShare.."\r\n"
msg = msg.."\tМакс. шара\t"..Record.maxSharer.." "..DoShareUnits((Record.maxShare))..")\r\n"

и соответственно добавление - удаление количества символов дефиса в разделителях (border)
Код
local msg, border = "", string.rep ("-", 80)

При проверке получилось криво, поэтому немного подровнял, см. картинку. Но то что на картинке - это применительно к показу исключительно конкретных, текущих значений. Поэтому надо осваивать такие мелочи, и не теряться ;)

 

 RecordBot_date_.lua ( 9.17 килобайт ) : 10
 

Автор: skonda 9.5.2009, 10:28

спасибо за скрипт. кстати в скрипте есть ошибка, как ее исправить?

в файле record данные
Record = {
["Share"] = 36838321281645,
["maxSharer"] = "Strannik",
["tShare"] = "09 Марта 2009 20:20",
["maxShare"] = 1554544152800,
["Users"] = 273,
["tUsers"] = "09 Марта 2009 20:57",
}
А отображается :

--------------------------------------------------------------------------------
Рекорд Значение Дата - Время
--------------------------------------------------------------------------------
Шара 33.5 ТБ 09 Марта 2009 20:20
Юзеры 273 чел. 09 Марта 2009 20:20
Макс. шара Strannik (1.4 ТБ)
--------------------------------------------------------------------------------

То есть время пика шары и пика юзеров всегда совпадает, хотя на самом деле это не так.

 record.rar ( 3 килобайт ) : 5
 

Автор: Setuper 9.5.2009, 11:20

А самому догадаться никак?
Строка 48:

Код
msg = msg.."\tЮзеры\t\t"..Record.Users.." чел.\t\t\t"..Record.tUsers.."\r\n"

Автор: district 9.5.2009, 11:51

Точно, был такой косячок. В отчет для даты рекорда шары и даты рекорда юзеров выводилась одна и та же дата - дата рекорда по шаре. Давно этим скриптом уже не пользуюсь, исправил да и забыл что такая ошибка была... Переприкреплю, на всякий случай ;)

Автор: skonda 9.5.2009, 12:25

Цитата(Setuper @ 9.5.2009, 12:20) *
А самому догадаться никак?
Строка 48:
Код
msg = msg.."\tЮзеры\t\t"..Record.Users.." чел.\t\t\t"..Record.tUsers.."\r\n"

пробовал, искал, но не нашел где править, т к не разбираюсь в скриптах.

Автор: Wariner 11.5.2009, 18:01

написали же тебе 48 строка!!! Если вдруг ты ищешь поиском, то не копируй всю строку, ибо здесь приведён уже окончательный вариант(на то что надо исправить)!

Автор: skonda 11.5.2009, 19:05

Цитата(Wariner @ 11.5.2009, 19:01) *
написали же тебе 48 строка!!! Если вдруг ты ищешь поиском, то не копируй всю строку, ибо здесь приведён уже окончательный вариант(на то что надо исправить)!
скрипт давно исправлен и работает, то что я ответил с цитированием означает то что я ответил цитатой, а не то, что я не понял как править, так что твой ор неуместен.

Автор: Wariner 11.5.2009, 19:21

тут не все экстрасенсы! если вопрос снят надо было так и сказать!

PS: остроту ума проявляй в программинге а не в сообщениях!