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

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

MyDC.ru _ Готовые скрипты для PtokaX _ Чат Комнаты

Автор: Setuper 17.10.2008, 12:38

Название: Чат комнаты
Версия: 1.0
Версия API: 2
Код: открытый
Автор: Setuper
Описание: возможно создать несколько чат комнат. Чат комнаты могут быть "закрытыми", то есть для получения сообщений нужно войти, а могут быть открытыми, то есть сообщения отсылаются всем доступным профилям (как в ОпЧате, вы не входите постоянно в ОпЧат, если вы Оператор, то он вам доступен). При запуске скрипта создаётся файл ChatRoom.dbs, в котором по умолчанию создаются 3 комнаты: комната для операторов, комната для випов и общая закрытая комната. В файле ChatRoom.dbs множество настроек. Опишу их на общей комнате:

Код
["-MembersRoom-"] = { -- название комнаты
    ["sMsgExit"] = "*** Вы покинули комнату.",  -- сообщение, отправляемое пользователю после выхода из комнаты
    ["tAllow"] = { -- профили, которым доступна комната
        [0] = 1,
        [2] = 1,
        [3] = 1,
        [1] = 1,
        [-1] = 0,
    },
    ["sDescription"] = "[БОТ] Чат комната для пользователей", -- описание бота
    ["sAway"] = false, -- режим бота: true - away, false - не away
    ["sEmail"] = "setuper@gmail.com", -- email бота
    ["sClientName"] = "DCBOT", -- название клиента бота
    ["bKey"] = true, -- имеет ли ключик бот: true - имеет, false - не имеет
    ["sTagOption"] = "M:A,H:0/0/1,S:0", -- тэг бота (не трогать, если не знаешь что это)
    ["sMsgEnter"] = "*** Добро пожаловать в чат комнату!", -- сообщение пользователю при входе в чат комнату
    ["bMembers"] = true, -- надо ли входить(выходить) в чат комнату: true - надо, false - не надо
    ["iShareSize"] = 0, -- шара бота чат комнаты
    ["tMembers"] = { -- таблица членов чат комнаты (не изменять)
    },
    ["tVisible"] = { -- профили, которым видна чат комната в списке пользователей
        [0] = 1,
        [2] = 1,
        [3] = 1,
        [1] = 1,
        [-1] = 1,
    },
    ["bReturn"] = true, -- возвращаемое значение чат комнатой
},
добавлю, что если скрипт чат комнаты в списке скриптов стоит до скрипта антирекламы и параметр bReturn=true, то сообщения чат комнаты не будут отслеживаться антирекламой, в противном случае будут.
После первого запуска скрипта в файле настроек по умолчанию создаётся 3 комнаты. Вы можете менять количество комнат по смоему усмотрению.

Конечно возможности программирования на lua не ограничены. Данный код я вырвал из SBot'a и немного преобразовал, но большая часть возможностей чат комнат осталась в SBot'е (чат комната непосредственно в чате, а не в личке, чёрные и белые списки для любого пользователя, установка паролей на чат комнаты, антифлуд, антимат, антикапс, антиреклама в чат комнатах и тд. и тп.). Нету времени.

Для самостоятельного перевода скрипта под версию API 1 следует воспользоваться инструкцией: http://mydc.ru/topic605.html

Юзаем! big_smile.gif

 chatrooms.lua ( 10.17 килобайт ) : 511
 

Автор: M.a.r.s.e.l 10.11.2008, 14:23

Выложите под API 1 если opl_api.lu скажите то я еще не научился пользоваться и тупит скрипт )

Автор: Setuper 10.11.2008, 20:24

Не понимаю, что не понятного? Всё очень подробно разобрано. Объясняю всё конкретно для этого скрипта:

1). Копируем в папку scripts файл old_api.lu

2). Открываем скрипт chatrooms.lua и в самом начале скрипта (можно перед комментарием, можно после) дописываем строчку:

Код
dofile(frmHub:GetPtokaXLocation().."scripts/old_api.lu")

3). Вместо OnStartup() пишем Core.OnStartup()
Вместо UserConnected(tUser) пишем Core.UserConnected(tUser)
Вместо RegConnected=UserConnected пишем Core.RegConnected=Core.UserConnected
Вместо OpConnected=UserConnected пишем Core.OpConnected=Core.UserConnected
Вместо ChatArrival(tUser,sData) пишем Core.ChatArrival(tUser,sData)
Вместо ToArrival(tUser,sData) пишем Core.ToArrival(tUser,sData)

Всё! Скрипт переведён! Не понимаю чего тут трудного?
Всё по инструкции big_smile.gif

Автор: M.a.r.s.e.l 10.11.2008, 21:14

о_О наконецто написал спасибо!

Автор: Jaska 26.1.2009, 15:50

Илья сделай еще модераторов к чатрум. Я когда-то делал-делал так и не доделал) вроде даже тут валялось.

Автор: Setuper 4.2.2009, 22:03

v 2.0

Fixed: Исправлена ошибка. При выходе из комнаты сообщения продолжали приходить.

Автор: mariner 4.2.2009, 23:55

так, еще - если 2жды войти в комнату - то она пропускает команду в чат. Лучше стобы оно комнату открывало!

PS а еще можно пароль на вход в комнату (типо чтоб можно было создат приваткомнату ;) )

Автор: D'aspid 5.2.2009, 0:01

Да пароль обязательно нужно big_smile.gif

Автор: Setuper 5.2.2009, 0:02

конечно пропустит, но не в чат, а в комнату, потому как это будет считаться за сообщение уже)))

Насчет паролей, то можно многое что сделать)))
Честно говоря не оптимизированные фичи делать не очень хочется, а без бд оптимизации можно не ждать(

Автор: mariner 5.2.2009, 0:17

ну хоть закров пропуск в чат повторного входа (PS у нас же линукс, делай с бд!)

Автор: dimetrius 5.2.2009, 1:32

Не хватает функции посмотреть кто подключен к комнате

Автор: BeSeR 7.3.2009, 15:47

Название: Чат комнаты
Версия: 1.0
Версия API: 2
Код: открытый
Автор: Setuper
Переведен : BeSeR Из API 2 под API 1
Файл :  чатрумы.lua ( 10.42 килобайт ) : 53

Автор: Setuper 7.3.2009, 15:52

Это лишнее. Перевести каждый может без проблем.

Автор: Tarantul13 18.4.2009, 9:49

[10:34] Синтаксис chatrooms.v4c.lua:35: bad argument #1 to 'pairs' (table expected, got nil) beat_brick.gif

Автор: Setuper 18.4.2009, 11:37

В 35 строке нет функции pairs. Либо ты что-то менял, либо у тебя не этот скрипт!

Автор: 0oZoNeK 27.7.2009, 20:53

А как сделать что бы нажимаешь в меню чат комната и войти и всё а не писать название название писать или просто в чат +войти и входит (Мне нужна только одна комната )??????

Автор: Setuper 4.8.2009, 16:54

Для этого надо использовать меню юзера, а не хаба))

Автор: Uncle_Dif 13.9.2009, 17:16

Я озадачен, скачал и установил этот скрипт и теперь у меня два оп-чата :пацталом:.
Пытался стереть оп-чат в птоке (0411), не удаётся. Зачем не два оп-чата... Что посоветуете?

Автор: X-Sky 20.9.2009, 23:23

Цитата(Uncle_Dif @ 13.9.2009, 22:16) *
Я озадачен, скачал и установил этот скрипт и теперь у меня два оп-чата :пацталом:.
Пытался стереть оп-чат в птоке (0411), не удаётся. Зачем не два оп-чата... Что посоветуете?

Лови, убрал ОПчат.

 chatrooms.lua ( 9.32 килобайт ) : 24

Автор: X-Sky 22.9.2009, 20:12

Неплохо бы было, если б можно было выкидывать юзеров из комнаты, либо запрещать к примеру определённому юзеру вход в комнату.

Автор: 0oZoNeK 4.10.2009, 11:33

Помогите пожалуйста я себе сделал 1 комнату для юзеров !!! в меню я убрал всё лишнее , вопрос как сделать что бы когда выбераешь Игровая > Войти и входит и не нужно писпть название %[line: Введите имя комнаты] как это убрать ???

Автор: Setuper 4.10.2009, 11:48

Для этого нужно вызывать меню юзера, а не меню хаба.

Автор: 0oZoNeK 4.10.2009, 16:30

Эм....а как это ???

Автор: Setuper 4.10.2009, 22:00

Правый клик по комнате, а не по вкладке хаба.

Автор: X-Sky 4.10.2009, 23:23

0oZoNeK, как я понял у тебя всего одна комната.
Если так - ложи скрипт, переделаю тебе его поудобнее.

Автор: 0oZoNeK 5.10.2009, 14:29

Я в этом скрипте кое что удалил ))) если что качни оригинал и переделай (Зарание благодарю + гарантирую) still_dreaming.gif
P.S Из этой комнаты я хочу сделать Игровую !!!

 chatrooms.lua ( 8.85 килобайт ) : 10
 

Автор: X-Sky 7.10.2009, 9:19

Получите, распишитесь big_smile.gif
Все 2 файла кидаем в папку "Scripts"
 ChatRooms.rar ( 3.1 килобайт ) : 50


P.S. На всякий случай, есть такая кнопочка "Спасибо" victory.gif

Автор: 0oZoNeK 13.10.2009, 15:58

Спасибо всё работает на отлично still_dreaming.gif

PS. Кнопка "Cпасибо" была учтена !!! )))

Автор: crake 22.10.2009, 22:31

Сделайте пожалуйста только одну чат-комнату для випов и без меню, чтобы вип по умолчанию в неё мог войти ( чтобы входить и выходить можно было командами). У меня чет ниче не получается(((

Автор: X-Sky 23.10.2009, 8:52

Лови, имя комнаты [VIP]Комната, видна в списке и доступна только VIР'ам
Не забывай про кнопку спасибоbig_smile.gif
 ChatRooms.rar ( 3.02 килобайт ) : 25

Автор: Wariner 23.10.2009, 10:49

я не понимаю неужели нельзя покопаться и правильно настроить скрипт из первого поста ?! зачем просить выкладывать его по новой, но с другой настройкой?!

PS: впредь такие сообщения будут удаляться без предупреждения!

Автор: Unterlink(X-Sky) 3.2.2010, 20:07

Не ругайся, Илюх, все мы были такими)

кстати

Цитата
большая часть возможностей чат комнат осталась в SBot'е (чат комната непосредственно в чате, а не в личке, чёрные и белые списки для любого пользователя, установка паролей на чат комнаты, антифлуд, антимат, антикапс, антиреклама в чат комнатах и тд. и тп.). Нету времени.

не думаешь доделывать?))

Автор: foXDEvil 16.3.2010, 11:54

Хочу сделать так чтобы в комнату каждое время писалось одно и тоже сообщение, но не выходит(((

На пример:

Код
function OnStartup()
tmr = TmrMan.AddTimer(600000)
end

function OnTimer(tmr)
Core.SendToAll("#Games","Сообщение")
end

Автор: Nickolya 16.3.2010, 13:47

Код
TmrMan.AddTimer(600000, "SendOnTimer")
добавить после
Код
function OnStartup()
и добавить функцию в самый конец скрипта:
Код
function SendOnTimer()
    tSys:SendToMembers("#Games","#Games","Сообщение","#Games")
end

Хотя я на 100% не уверен...

Автор: foXDEvil 16.3.2010, 14:48

Код
function OnStartup()
    tmr = TmrMan.AddTimer(600000)
end
function OnTimer(tmr)
    tSys:SendToMembers("#Games","#Games","Сообщение","#Games")
end
Спасибо big_smile1.gif
вот этот вариант работает =)

Ещё кое что =) выложите плиз сюда ту часть в которой задаётся функция команды Members и где происходит чтение списка пользователей в комнате из файла ChatRoom.dbs. Сам пробовал сделать но результат 0

Я хочу сделать так чтобы другой скрипт читал файл ChatRoom.dbs, который так и будет изменятся скриптом chatrooms, и отсылал сообщение пользователям в комнате

Автор: VOVKT 11.9.2010, 6:20

Цитата(X-Sky @ 7.10.2009, 10:19) *
Получите, распишитесь big_smile.gif
Все 2 файла кидаем в папку "Scripts"
 ChatRooms.rar ( 3.1 килобайт ) : 50


P.S. На всякий случай, есть такая кнопочка "Спасибо" victory.gif

помогите в этой версии сделать чтоб по команде выводило кол-во и ники юзеров в комнате
ну или скажите как пощитать кол-во строк в таблице ["tMembers"] и вывести их
моего незнания хватило лиш на это:
Код
elseif self:String2Lower(sCmd)==self:String2Lower(self.sCmdUsers) then
            sRoom=self:CheckRoom(sA,sNick,sRoom)
            if not sRoom then
                return true
            end
            if tRooms[sRoom]["tMembers"][sNick] then
                tSys:SendToUser(sNick,"Кол-во юзеров......",sRoom,sRoom)
                return true
            end

Автор: Nickolya 12.9.2010, 20:07

Попробуй вот так:

Код
        elseif self:String2Lower(sCmd)==self:String2Lower(self.sCmdUsers) then
            sRoom=self:CheckRoom(sA,sNick,sRoom)
            if not sRoom then
                return true
            end
            if tRooms[sRoom]["tMembers"][sNick] then
                local i, sMembers = 0, {}
                for sNick in pairs(tRooms[sRoom]["tMembers"]) do
                    i = i + 1
                    table.insert(sMembers, sNick)
                end
                sMembers = table.concat(sMembers, ', ')
                tSys:SendToUser(sNick,"В комнате "..i.." пользователей: "..sMembers,sRoom,sRoom)
                return true
            end

Автор: VOVKT 14.9.2010, 12:20

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

Автор: Nickolya 14.9.2010, 12:34

Код
                -- return true    -- было вот здесь
            end
            return true    -- стало здесь, и так надо сделать по всей функции tSys:DoCmd(sNick,sArg,sRoom)
        elseif self:String2Lower(sCmd)==self:String2Lower(self.sCmdExit) then

Автор: VOVKT 14.9.2010, 13:15

примного благодарен все работает, а как сделать поле ["sMsgEnter"] много строчным?

Автор: Setuper 14.9.2010, 13:41

Код
["sMsgEnter"] = [[много
много
очень много
строк]],

Автор: VOVKT 14.9.2010, 14:53

спасиб)
скажите что не правильно я делаю в функции которая при дисконекте юзера убирает его из списка пользователей в комнате

Код
function UserDisconnected(sNick)
            local zRoom="[R]Games"
            if not zRoom then
                return true
            end
            if tRooms[zRoom]["tMembers"][sNick] then
                tRooms[zRoom]["tMembers"][sNick]=nil
                tSys:Save(tRooms,"zRooms",tSys.sScriptsPath..tSys.hFile)
                if self.bShowEnterExit then self:SendToMembers(sNick,zRoom,"*** Вышел: "..sNick,zRoom) end
            end
    return true
end


и еще помогите исправить такую вещь:
когда отправляеш сообщение то тебе отображается нормально но собиседнику приходит с доп пробелом с переди,
если в tSys:SendToUser удалить пробел
Код
      
  if type(User)=="table" then
            Core.SendToUser(User,"$To: sNick From: "..Sender.." $<"..Nick.."> "..sMsg)
        else
            Core.SendToNick(User,"$To: sNick From: "..Sender.." $<"..Nick..">"..sMsg)   -- вот тут после >
        end

то сообщения от бота приходят с потеряным первым символом(

Автор: Nickolya 15.9.2010, 9:15

Код
function UserDisconnected(tUser)
    for sRoom, t in pairs(tRooms) do
        local sNick = tUser.sNick
        if tRooms[sRoom]["tMembers"][sNick] then
            tRooms[sRoom]["tMembers"][sNick]=nil
            tSys:Save(tRooms,"tRooms",tSys.sScriptsPath..tSys.hFile)
            tSys:SendToUser(sNick,tRooms[sRoom].sMsgExit,sRoom,sRoom)
            if tSys.bShowEnterExit then tSys:SendToMembers(sNick,sRoom,"*** Вышел: "..sNick,sRoom) end
        end
    end
end


Чтобы не было лишнего пробела замени
Код
    local _,_,sArg1,sArg2,sArg3=string.find(sData,"%$To:%s+(%S+)%s+From:%s+(%S+)%s+%$%b<>(.*)")
на
Код
    local _,_,sArg1,sArg2,sArg3=string.find(sData,"%$To:%s+(%S+)%s+From:%s+(%S+)%s+%$%b<>%s(.*)")

Автор: VOVKT 16.9.2010, 14:13

спасиб, щас заметил что юзеры видят команды которые отправили(

вот еще два вопроса:
1) юзер посылает сообщение в чат комнату, я сделал что всем кто в комнате это фраза приходит от другова ника
в функции tSys:SendToUser добавил:

Код
if tRooms[Sender]["nMembers"][Nick] then Nick=tRooms[Sender]["nMembers"][Nick] end

и все какбы работает, но отправителю сообщение возвращается с егоже ником собственно вопрос как отправителю прислать с изм ником?
2) сложно написать как надо поэтому приведу пример:
пользователь посылает комнду в чат комнату +command text
как поймать этот текст в условии или как переписать условие чтоб ловил?
Код
elseif self:String2Lower(sCmd)==self:String2Lower(self.sCmdName) then
            sRoom=self:CheckRoom(sA,sNick,sRoom)
            if tRooms[sRoom]["tMembers"][sNick] then

Автор: Nickolya 21.9.2010, 17:29

VOVKT, то, что юзер отправляет кому-то в приват, он всегда видит в неизменном виде, в отличие от общего чата, так что отправлять ему его же текст не имеет смысла. И все команды и прочее, что идет в привате всегда будут видны "как есть". Что касается захвата, то в функции tSys:DoCmd идущие за командой даты ловятся как

Код
sA