WEBAPI.on ( CHAT_EVENT, process_chat( message) ) // При сообщении в чате вызывается
// функция обработки сообщений
var Queue = new Array ( ) ;
function eventloop( ) { // как бы эвент луп
l = Queue.length // если в очереди что-то есть
if ( l> 0 ) {
for ( i= 0 ; i<= l; i++ ) { // то выполняет все функции,
Queue.pop ( i) ( ) // удаляя из массива.
// ПОДОЖДАТЬ, ПОКА ВЫПОЛНИТСЯ, И ТОЛЬКО ЗАТЕМ
// ПЕРЕХОДИТ К СЛЕДУЮЩЕЙ ИТЕРАЦИИ!
}
}
setTimeout( eventloop, 100 ) // вызывается заново, чтобы луп.
}
function process_chat( message) { // тут довольно очевидно
if ( message == "a" ) {
Queue.push ( chat1)
}
if ( message == "b" ) {
Queue.push ( chat2)
}
}
function chat1( ) {
ACTION1 // Делается какое-то действие
WAIT 250 // Затем нужно немного подождать, иначе действие 2
ACTION2 // сайтом обработано не будет (или будет обработано неправильно)
WAIT 250
ACTION3
/*
Например:
1. переименовать пользователя в govnyashka;
2. Замутить пользователя с ником govnyashka;
3. Переименовать пользователя из govnyashak обратно в тот, который был.
Если это будет выполняться со скоростью рантайма, то мута не произойдёт, так как
на момент выполнения команды ACTION2 сайт, по всей видимости,
ещё не в курсе, что кто-то был переименовать, в итоге мутить некого. Если подождать
сотню-две мс, то всё нормально.
*/
}
// ! Так как нет wait(), sleep(), delay(), пока что имплементировано это через setTimeout вот так:
function chat1( ) {
ACTION1
setTimeout( ACTION2, 250 ) // 250
setTImeout( ACTION3, 500 ) // плюс ещё 250
}
/*
Разумеется, если chat1() будет вызвано прямиком из process_chat, то ACTION'ы будут
друг на друга наслаиваться (таймер action2 от второго вызова закончится раньше, чем
таймер action3 первого вызова, если так быстро будут присланы два сообщения.
что в случае пользователей >1 вполне возможно.) А мне бы этого не хотелось,
так как что-нибудь, да сломается от такого поведения.
Так как setTimeout добавляет фукнцию в стек уже после истечения таймера, у меня нет
никакой возможности узнать, когда функция выполнилась.
*/
function chat2( ) {
ACTION1 // какая-то другая подобная функция
}
V0VCQVBJLm9uKENIQVRfRVZFTlQscHJvY2Vzc19jaGF0KG1lc3NhZ2UpKSAvLyDQn9GA0Lgg0YHQvtC+0LHRidC10L3QuNC4INCyINGH0LDRgtC1INCy0YvQt9GL0LLQsNC10YLRgdGPIAoJCQkJCQkJCQkJCS8vINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0LHQvtGC0LrQuCDRgdC+0L7QsdGJ0LXQvdC40LkKCnZhciBRdWV1ZSA9IG5ldyBBcnJheSgpOwoKZnVuY3Rpb24gZXZlbnRsb29wKCkgewkJCS8vINC60LDQuiDQsdGLINGN0LLQtdC90YIg0LvRg9C/CglsID0gUXVldWUubGVuZ3RoCQkJLy8g0LXRgdC70Lgg0LIg0L7Rh9C10YDQtdC00Lgg0YfRgtC+LdGC0L4g0LXRgdGC0YwKCWlmIChsPjApIHsKCQlmb3IgKGk9MDtpPD1sO2krKyl7CQkvLyDRgtC+INCy0YvQv9C+0LvQvdGP0LXRgiDQstGB0LUg0YTRg9C90LrRhtC40LgsCgkJCVF1ZXVlLnBvcChpKSgpCQkvLyDRg9C00LDQu9GP0Y8g0LjQtyDQvNCw0YHRgdC40LLQsC4KCQkJLy8g0J/QntCU0J7QltCU0JDQotCsLCDQn9Ce0JrQkCDQktCr0J/QntCb0J3QmNCi0KHQrywg0Jgg0KLQntCb0KzQmtCeINCX0JDQotCV0JwKCQkJLy8g0J/QldCg0JXQpdCe0JTQmNCiINCaINCh0JvQldCU0KPQrtCp0JXQmSDQmNCi0JXQoNCQ0KbQmNCYIQoJCX0KCX0KCXNldFRpbWVvdXQoZXZlbnRsb29wLDEwMCkJLy8g0LLRi9C30YvQstCw0LXRgtGB0Y8g0LfQsNC90L7QstC+LCDRh9GC0L7QsdGLINC70YPQvy4KfQoKZnVuY3Rpb24gcHJvY2Vzc19jaGF0KG1lc3NhZ2UpewkvLyDRgtGD0YIg0LTQvtCy0L7Qu9GM0L3QviDQvtGH0LXQstC40LTQvdC+CglpZiAobWVzc2FnZSA9PSAiYSIpewoJCVF1ZXVlLnB1c2goY2hhdDEpCgl9CglpZiAobWVzc2FnZSA9PSAiYiIpewoJCVF1ZXVlLnB1c2goY2hhdDIpCgl9Cn0KCmZ1bmN0aW9uIGNoYXQxKCl7CglBQ1RJT04xCQkJLy8g0JTQtdC70LDQtdGC0YHRjyDQutCw0LrQvtC1LdGC0L4g0LTQtdC50YHRgtCy0LjQtQoJV0FJVCAyNTAJCS8vINCX0LDRgtC10Lwg0L3Rg9C20L3QviDQvdC10LzQvdC+0LPQviDQv9C+0LTQvtC20LTQsNGC0YwsINC40L3QsNGH0LUg0LTQtdC50YHRgtCy0LjQtSAyCglBQ1RJT04yCQkJLy8g0YHQsNC50YLQvtC8INC+0LHRgNCw0LHQvtGC0LDQvdC+INC90LUg0LHRg9C00LXRgiAo0LjQu9C4INCx0YPQtNC10YIg0L7QsdGA0LDQsdC+0YLQsNC90L4g0L3QtdC/0YDQsNCy0LjQu9GM0L3QvikKCVdBSVQgMjUwCglBQ1RJT04zCgkvKgoJ0J3QsNC/0YDQuNC80LXRgDogCgkxLiDQv9C10YDQtdC40LzQtdC90L7QstCw0YLRjCDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8g0LIgZ292bnlhc2hrYTsgCgkyLiDQl9Cw0LzRg9GC0LjRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyDRgSDQvdC40LrQvtC8IGdvdm55YXNoa2E7CgkzLiDQn9C10YDQtdC40LzQtdC90L7QstCw0YLRjCDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8g0LjQtyBnb3ZueWFzaGFrINC+0LHRgNCw0YLQvdC+INCyINGC0L7Rgiwg0LrQvtGC0L7RgNGL0Lkg0LHRi9C7LgoJ0JXRgdC70Lgg0Y3RgtC+INCx0YPQtNC10YIg0LLRi9C/0L7Qu9C90Y/RgtGM0YHRjyDRgdC+INGB0LrQvtGA0L7RgdGC0YzRjiDRgNCw0L3RgtCw0LnQvNCwLCDRgtC+INC80YPRgtCwINC90LUg0L/RgNC+0LjQt9C+0LnQtNGR0YIsINGC0LDQuiDQutCw0LoKCdC90LAg0LzQvtC80LXQvdGCINCy0YvQv9C+0LvQvdC10L3QuNGPINC60L7QvNCw0L3QtNGLIEFDVElPTjIg0YHQsNC50YIsINC/0L4g0LLRgdC10Lkg0LLQuNC00LjQvNC+0YHRgtC4LAoJ0LXRidGRINC90LUg0LIg0LrRg9GA0YHQtSwg0YfRgtC+INC60YLQvi3RgtC+INCx0YvQuyDQv9C10YDQtdC40LzQtdC90L7QstCw0YLRjCwg0LIg0LjRgtC+0LPQtSDQvNGD0YLQuNGC0Ywg0L3QtdC60L7Qs9C+LiDQldGB0LvQuCDQv9C+0LTQvtC20LTQsNGC0YwKCdGB0L7RgtC90Y4t0LTQstC1INC80YEsINGC0L4g0LLRgdGRINC90L7RgNC80LDQu9GM0L3Qvi4KCSovCn0KCi8vICEg0KLQsNC6INC60LDQuiDQvdC10YIgd2FpdCgpLCBzbGVlcCgpLCBkZWxheSgpLCDQv9C+0LrQsCDRh9GC0L4g0LjQvNC/0LvQtdC80LXQvdGC0LjRgNC+0LLQsNC90L4g0Y3RgtC+INGH0LXRgNC10Lcgc2V0VGltZW91dCDQstC+0YIg0YLQsNC6OgpmdW5jdGlvbiBjaGF0MSgpewoJQUNUSU9OMQoJc2V0VGltZW91dChBQ1RJT04yLDI1MCkgLy8gMjUwCglzZXRUSW1lb3V0KEFDVElPTjMsNTAwKSAvLyDQv9C70Y7RgSDQtdGJ0ZEgMjUwCn0KLyoK0KDQsNC30YPQvNC10LXRgtGB0Y8sINC10YHQu9C4IGNoYXQxKCkg0LHRg9C00LXRgiDQstGL0LfQstCw0L3QviDQv9GA0Y/QvNC40LrQvtC8INC40LcgcHJvY2Vzc19jaGF0LCDRgtC+IEFDVElPTifRiyDQsdGD0LTRg9GCCtC00YDRg9CzINC90LAg0LTRgNGD0LPQsCDQvdCw0YHQu9Cw0LjQstCw0YLRjNGB0Y8gKNGC0LDQudC80LXRgCBhY3Rpb24yINC+0YIg0LLRgtC+0YDQvtCz0L4g0LLRi9C30L7QstCwINC30LDQutC+0L3Rh9C40YLRgdGPINGA0LDQvdGM0YjQtSwg0YfQtdC8CtGC0LDQudC80LXRgCBhY3Rpb24zINC/0LXRgNCy0L7Qs9C+INCy0YvQt9C+0LLQsCwg0LXRgdC70Lgg0YLQsNC6INCx0YvRgdGC0YDQviDQsdGD0LTRg9GCINC/0YDQuNGB0LvQsNC90Ysg0LTQstCwINGB0L7QvtCx0YnQtdC90LjRjy4K0YfRgtC+INCyINGB0LvRg9GH0LDQtSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQuSA+MSDQstC/0L7Qu9C90LUg0LLQvtC30LzQvtC20L3Qvi4pINCQINC80L3QtSDQsdGLINGN0YLQvtCz0L4g0L3QtSDRhdC+0YLQtdC70L7RgdGMLArRgtCw0Log0LrQsNC6INGH0YLQvi3QvdC40LHRg9C00YwsINC00LAg0YHQu9C+0LzQsNC10YLRgdGPINC+0YIg0YLQsNC60L7Qs9C+INC/0L7QstC10LTQtdC90LjRjy4K0KLQsNC6INC60LDQuiBzZXRUaW1lb3V0INC00L7QsdCw0LLQu9GP0LXRgiDRhNGD0LrQvdGG0LjRjiDQsiDRgdGC0LXQuiDRg9C20LUg0L/QvtGB0LvQtSDQuNGB0YLQtdGH0LXQvdC40Y8g0YLQsNC50LzQtdGA0LAsINGDINC80LXQvdGPINC90LXRggrQvdC40LrQsNC60L7QuSDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INGD0LfQvdCw0YLRjCwg0LrQvtCz0LTQsCDRhNGD0L3QutGG0LjRjyDQstGL0L/QvtC70L3QuNC70LDRgdGMLgoqLwoKZnVuY3Rpb24gY2hhdDIoKXsKCUFDVElPTjEJCQkvLyDQutCw0LrQsNGPLdGC0L4g0LTRgNGD0LPQsNGPINC/0L7QtNC+0LHQvdCw0Y8g0YTRg9C90LrRhtC40Y8KfQ==