2016-04-05 5 views
1

Я занимаюсь ExIrc, чтобы сделать простой бот, но я не могу заставить его работать.Запуск ExIrc supervisor сбой

Я получаю эту ошибку:

** (Mix) Could not start application streamingutils: TwitchSniper.start(:normal, 
[]) returned an error: shutdown: failed to start child: TwitchSniper.Bot 
    ** (EXIT) an exception was raised: 
     ** (ArgumentError) argument error 
      :erlang.apply([%TwitchSniper.Bot.State{client: nil, handlers: [], host: "irc.chat.twitch.tv", name: "Paul Schoenfelder", nick: "hajtosek", pass: "my password", port: 6667, user: "hajtosek"}], :host, []) 
      (streamingutils) TwitchSniper.Bot.init/1 
      (stdlib) gen_server.erl:328: :gen_server.init_it/6 
      (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3 

Я пытался использовать ExIrc библиотеку: https://github.com/bitwalker/exirc

Я просто скопировал большую часть кода из ридх, просто поменялся данные

код :

defmodule State do 
    defstruct host: "irc.chat.twitch.tv", 
       port: 6667, 
       pass: "password", 
       nick: "hajtosek", 
       user: "hajtosek", 
       name: "Paul Schoenfelder", 
       client: nil, 
       handlers: [] 
end 

def start_link(_) do 
    GenServer.start_link(__MODULE__, [%State{}]) 
end 

def init(state) do 
    # Start the client and handler processes, the ExIrc supervisor is automatically started when your app runs 
    {:ok, client} = ExIrc.start_client!() 
    #{:ok, handler} = ExampleHandler.start_link(nil) 

    # Register the event handler with ExIrc 
    ExIrc.Client.add_handler client, self 

    # Connect and logon to a server, join a channel and send a simple message 
    ExIrc.Client.connect! client, state.host, state.port 
    ExIrc.Client.logon  client, state.pass, state.nick, state.user, state.name 
    ExIrc.Client.join  client, "#channel" 
    ExIrc.Client.msg  client, :privmsg, "#channel", "Hello world!" 
    ExIrc.Client.msg  client, :ctcp, "#channel", "Hello world!" 

    IO.inspect "IRC activated" 

    {:ok, %{state | :client => client, :handlers => [self]}} 
end 

def terminate(_, state) do 
    # Quit the channel and close the underlying client connection when the process is terminating 
    ExIrc.Client.quit state.client, "Goodbye, cruel world." 
    ExIrc.Client.stop! state.client 
    :ok 
end 

ответ

2

Это, кажется, опечатка в README. Аргумент state для init всегда является списком (он получает список, присвоенный GenServer.start_link). Таким образом, проблема заключается в том, что вы пытаетесь использовать состояние, подобное структуре, когда оно не одно. Просто измените функциональную головку на init на [state] вместо state, и вам будет хорошо.

EDIT: Также стоит отметить, что вы должны взглянуть в папке примеров на GitHub для полных приложений, которые используют exirc, это более реалистичные примеры.

+0

Большое спасибо, должен сообщить автору библиотеки. – Haito

+0

Я являюсь автором lib, поэтому считаю, что он сообщил;) – bitwalker

 Смежные вопросы

  • Нет связанных вопросов^_^