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

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

MyDC.ru _ Служебные скрипты [PtokaX] _ Greeting_in_OpChat

Автор: X-Sky 8.10.2009, 18:05

Название скрипта: Greeting in OpChat
Версия API: API2
Автор: X-Sky
Дата написания: 8.10.2009
Описание скрипта: Приветствие/прощание состава администрации в ОпЧате
Прикрепленный скрипт:  Greeting_in_OpChat.lua ( 807 байт ) : 221


P.S. Поздравьте, мой первый написанный "с нуля" скрипт big_smile.gif По голове не бейте, если что не так victory.gif

Автор: Артём 8.10.2009, 18:16

unhappy.gif а зачем в опчате это нужно?

Автор: X-Sky 8.10.2009, 18:37

Так, для удобства big_smile.gif

Автор: Wariner 8.10.2009, 18:44

поздравляю)))))

Автор: X-Sky 8.10.2009, 18:45

Спасибо, Wariner ;)

Автор: Setuper 8.10.2009, 18:52

Когда пишешь скрипт, нужно понимать за что отвечает каждая функция. Нужно писать скрипты как можно более оптимизированными.
Функция Core.GetUserAllData(tUser) бестолку вызывается, при этом нагружая хаб не столько из-за вызова, сколько из-за занесения данных в таблицу tUser.

Переменные sInMes и sOutMes следует сделать локальными, а не глобальными.

Переменные OpChat, sInMessages и sOutMessages также следует снабдить словом local, так как локальные переменные вызываются быстрее, чем глобальные.

Автор: Wariner 8.10.2009, 18:52

А теперь комментарии в стиле Setuper`а )))

1) таблицы лучше сделать локальными + для удобства вынести в начало скрипта
2) мне тоже задавали этот вопрос:
зачем строчка

Код
Core.GetUserAllData(tUser)

3) не нужно вводить лишнюю переменную при этом ещё и глобальную!
вместо
Код
       sInMes = sInMessages[tUser.iProfile]
       if sInMes then

так
Код
if sInMessages[tUser.iProfile] then

4) не
Код
Core.SendPmToOps(""..OpChat.."", ""..sOutMes.." "..tUser.sNick..";)")

а так
Код
Core.SendPmToOps(OpChat, ("%s %s;)"):format(sOutMes, tUser.sNick))




upd: ну вот я и не успел xDDD

Автор: Setuper 8.10.2009, 18:53

Если придерживаешься Венгерской нотации, то переменные нужно писать соответствующим образом: sOpChat, tInMessages, tOutMessages

Интересно из какого скрипта пошла такая петрушка с обрамлением переменной пустыми строками: ""..OpChat.."" ?
Ведь тут не только 2 лишние конкатенации, но и пустые строки "" будут каждый раз выделять под себя память.

Автор: X-Sky 8.10.2009, 18:57

Спасибо за советы, парни! big_smile.gif

Автор: Wariner 8.10.2009, 18:59

поправь и перезалей ;)

Автор: X-Sky 8.10.2009, 19:36

вместо

Код
sInMes = sInMessages[tUser.iProfile]
if sInMes then

так
Код
if sInMessages[tUser.iProfile] then

- не работает, приветствия не выводятся, а так, всё исправил, перезалил в первый пост big_smile.gif
Всем ещё раз спасибо за помощь big_smile.gif

Автор: Setuper 8.10.2009, 20:28

Функцию Core.GetUserAllData(tUser) так и не убрал.

Могу сказать одно, разработчики хаба пытались снизить затраты на выполнения скриптов, однако, на мой взгляд, до конца не снизили их, и оставили в таблице часто используемые поля: sNick, sIP, iProfile, хотя для наилучшей оптимизации программист в скрипте сам должен выбирать какие необходимые поля должна содержать таблица.

Думаю должно быть так:

Код
local sOpChat = "[Chat]OpChat"
local tInMessages = {
  [0] = "Пришёл админ",
  [1] = "Пришёл оператор",
}

function UserConnected(tUser)
  if tInMessages[tUser.iProfile] then
    Core.SendPmToOps(sOpChat, ("%s %s;)"):format(tInMessages[tUser.iProfile], tUser.sNick))
  end
end

local tOutMessages = {
  [0] = "Ушёл админ",
  [1] = "Ушёл оператор",
}

function UserDisconnected(tUser)
  if tOutMessages[tUser.iProfile] then
    Core.SendPmToOps(sOpChat, ("%s %s;)"):format(tOutMessages[tUser.iProfile], tUser.sNick))
  end
end

OpConnected, RegConnected = UserConnected, UserConnected
OpDisconnected, RegDisconnected = UserDisconnected, UserDisconnected

Автор: X-Sky 9.10.2009, 7:30

Исправил, перезалил big_smile.gif
Ещё раз спасибо спасибо за помощь, Setuper