0

End transition to go project layout

This commit is contained in:
eleksir
2025-10-12 12:57:09 +03:00
parent 79840796f6
commit d527c4ab8f
8 changed files with 199 additions and 237 deletions

View File

@@ -0,0 +1,142 @@
package irc
import "strings"
/* По сути, сбор mode-ов пользователей нам пока нужен только для того, чтобы определять следующие вещи:
- Может ли nick для определённого канала воспользоваться командой admin
- Применять ли ограничения на исходящие сообщения (пока что в состоянии todo.) MODE-ы +v и +o для бота на libera.chat
активируют мягкий ratelimit на стороне сервера, без них, сервер просто рвёт соединение по превышению лимитов
*/
// Удаляет сведения о MODE-ах пользователя для заданного канала.
func userModeDeleteUser(ircChan string, nick string) {
channel, ok := UserMode.Get(ircChan)
if ok {
channelData := channel.(map[string]map[string]bool)
delete(channelData, nick)
if len(channelData) == 0 {
UserMode.Delete(ircChan)
} else {
UserMode.Set(ircChan, channelData)
}
}
}
// Удаляет сведения о MODE-ах пользователя для всех каналов, на которых есть бот.
func userModePurgeUser(nick string) {
for _, channel := range Config.Irc.Channels {
userModeDeleteUser(channel, nick)
}
}
// Обновляет или создаёт запись о mode-ах пользователей.
func userModeUpdateUser(ircChan string, nick string, modes string) {
var channelData map[string]map[string]bool
channel, ok := UserMode.Get(ircChan)
if ok {
channelData = channel.(map[string]map[string]bool)
}
if channelData == nil {
channelData = make(map[string]map[string]bool)
}
if channelData[nick] == nil {
channelData[nick] = make(map[string]bool)
}
switch modes[:1] {
case "+":
for _, mode := range strings.Split(modes[1:], "") {
channelData[nick][mode] = true
}
case "-":
for _, mode := range strings.Split(modes[1:], "") {
channelData[nick][mode] = false
}
}
UserMode.Set(ircChan, channelData)
}
// Возвращает значение MODE-а v для запрошенного ника.
func userModeIsVoiced(ircChan string, nick string) bool {
var channelData map[string]map[string]bool
channel, ok := UserMode.Get(ircChan)
if ok {
channelData = channel.(map[string]map[string]bool)
} else {
return false
}
if channelData == nil {
return false
}
if channelData[nick] == nil {
return false
}
if channelData[nick]["v"] {
return true
}
return false
}
// Возвращает значение MODE-а o для запрошенного ника.
func userModeIsOped(ircChan string, nick string) bool {
var channelData map[string]map[string]bool
channel, ok := UserMode.Get(ircChan)
if ok {
channelData = channel.(map[string]map[string]bool)
} else {
return false
}
if channelData == nil {
return false
}
if channelData[nick] == nil {
return false
}
if channelData[nick]["o"] {
return true
}
return false
}
func userModeIsHere(ircChan string, nick string) bool {
var channelData map[string]map[string]bool
channel, ok := UserMode.Get(ircChan)
if ok {
channelData = channel.(map[string]map[string]bool)
} else {
return false
}
if channelData == nil {
return false
}
if channelData[nick] != nil {
return true
}
return false
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */