You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.7 KiB
104 lines
2.7 KiB
// AnonIRCd - Anonymous IRC daemon |
|
// https://github.com/sageru-6ch/anonircd |
|
// |
|
// This program is free software: you can redistribute it and/or modify |
|
// it under the terms of the GNU General Public License as published by |
|
// the Free Software Foundation, either version 3 of the License, or |
|
// (at your option) any later version. |
|
// |
|
// This program is distributed in the hope that it will be useful, |
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
// GNU General Public License for more details. |
|
// |
|
// You should have received a copy of the GNU General Public License |
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
package main |
|
|
|
import ( |
|
"fmt" |
|
"log" |
|
"math/rand" |
|
"net/http" |
|
_ "net/http/pprof" |
|
"os" |
|
"os/signal" |
|
"syscall" |
|
"time" |
|
|
|
"github.com/jessevdk/go-flags" |
|
"github.com/pkg/errors" |
|
"gopkg.in/sorcix/irc.v2" |
|
) |
|
|
|
var prefixAnonIRC = irc.Prefix{Name: "AnonIRC"} |
|
var prefixAnonymous = irc.Prefix{Name: "Anonymous", User: "Anon", Host: "IRC"} |
|
|
|
const defaultMOTD = ` |
|
_|_| _|_|_| _|_|_| _|_|_| |
|
_| _| _|_|_| _|_| _|_|_| _| _| _| _| |
|
_|_|_|_| _| _| _| _| _| _| _| _|_|_| _| |
|
_| _| _| _| _| _| _| _| _| _| _| _| |
|
_| _| _| _| _|_| _| _| _|_|_| _| _| _|_|_| |
|
` |
|
const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
|
const writebuffersize = 10 |
|
|
|
const ( |
|
channelLobby = "#" |
|
channelServer = "&" |
|
) |
|
|
|
var debugMode = false |
|
var verbose = false |
|
|
|
func main() { |
|
rand.Seed(time.Now().UTC().UnixNano()) |
|
|
|
var opts struct { |
|
ConfigFile string `short:"c" long:"config" description:"Configuration file"` |
|
Debug int `short:"d" long:"debug" description:"Serve pprof data on specified port"` |
|
BareLog bool `short:"b" long:"bare-log" description:"Don't add current date/time to log entries"` |
|
Verbose bool `short:"v" long:"verbose" description:"Log verbosely"` |
|
} |
|
|
|
_, err := flags.Parse(&opts) |
|
if err != nil { |
|
log.Panicf("%+v", errors.Wrap(err, "failed to parse flags")) |
|
} |
|
|
|
if opts.Debug > 0 { |
|
debugMode = true |
|
log.Printf("WARNING: Running in debug mode. pprof data is available at http://localhost:%d/debug/pprof/", opts.Debug) |
|
go http.ListenAndServe(fmt.Sprintf("localhost:%d", opts.Debug), nil) |
|
} |
|
|
|
if opts.BareLog { |
|
log.SetFlags(0) |
|
} |
|
|
|
verbose = opts.Verbose |
|
|
|
s := NewServer(opts.ConfigFile) |
|
err = s.loadConfig() |
|
if err != nil { |
|
log.Panicf("%+v", errors.Wrap(err, "failed to load configuration file")) |
|
} |
|
s.connectDatabase() |
|
defer s.closeDatabase() |
|
|
|
sighup := make(chan os.Signal, 1) |
|
signal.Notify(sighup, syscall.SIGHUP) |
|
go func() { |
|
for { |
|
<-sighup |
|
err := s.reload() |
|
if err != nil { |
|
log.Println(err) |
|
} |
|
} |
|
}() |
|
|
|
s.listen() |
|
}
|
|
|