diff --git a/main.go b/main.go new file mode 100644 index 0000000..b7448ba --- /dev/null +++ b/main.go @@ -0,0 +1,195 @@ +package main + +import ( + "go-xmpp4steam/steam" + "go-xmpp4steam/xmpp" + + "github.com/jimlawless/cfg" + "github.com/Philipp15b/go-steam/internal/steamlang" + + "bufio" + "log" + "os" + "strings" + "time" +) + +const ( + configurationFilePath = "xmpp4steam.cfg" +) + +var ( + mymap = make(map[string]string) +) + +func init() { + err := cfg.Load(configurationFilePath, mymap) + if err != nil { + log.Fatal("Failed to load configuration file located at %s", configurationFilePath, err) + } + + // XMPP config + xmpp.Addr = mymap["xmpp_server_address"]+":"+mymap["xmpp_server_port"] + xmpp.JidStr = mymap["xmpp_hostname"] + xmpp.Secret = mymap["xmpp_secret"] + xmpp.PreferedJID = mymap["xmpp_authorized_jid"] + + // Steam config + steam.Username = mymap["steam_login"] + steam.Password = mymap["steam_password"] + steam.AuthCode = mymap["steam_auth_code"] +} + +func main() { + go gatewayXmppSteamAction() + go gatewaySteamXmppAction() + + go gatewayXmppSteamPresence() + go gatewayXmppSteamMessage() + + go gatewaySteamXmppMessage() + go gatewaySteamXmppPresence() + + go steam.Run() + go xmpp.Run() + + inputStop() + + steam.Disconnect() + xmpp.Disconnect() + time.Sleep(1 * time.Second) +} + + +// XMPP -> Steam gateways +func gatewayXmppSteamAction() { + for { + action := <- xmpp.ChanAction + + switch action { + case xmpp.ActionConnexion: + if !steam.IsConnected() { + steam.Connect() + } + + case xmpp.ActionDeconnexion: + if steam.IsConnected() { + steam.Disconnect() + } + } + } +} + +func gatewayXmppSteamPresence() { + for { + status := <- xmpp.ChanPresence + var steamStatus steamlang.EPersonaState + + switch status { + case xmpp.Status_online: + steamStatus = steam.State_Online + + case xmpp.Status_away: + steamStatus = steam.State_Away + + case xmpp.Status_chat: + + case xmpp.Status_extended_away: + steamStatus = steam.State_Snooze + + case xmpp.Status_do_not_disturb: + steamStatus = steam.State_Busy + } + + steam.SendPresence(steamStatus) + } +} + +func gatewayXmppSteamMessage() { + for { + steamId := <- xmpp.ChanMessage + message := <- xmpp.ChanMessage + + steam.SendMessage(steamId, message) + } +} +// /XMPP -> Steam gateways + + + +// Steam -> XMPP gateways +func gatewaySteamXmppAction() { + for { + action := <- steam.ChanAction + switch action { + case steam.ActionConnected: + xmpp.SendPresence(xmpp.CurrentStatus, xmpp.Type_available) + + case steam.ActionDisconnected: + xmpp.Disconnect() + } + } +} + +func gatewaySteamXmppMessage() { + for { + steamId := <- steam.ChanMessage + message := <- steam.ChanMessage + xmpp.SendMessage(steamId+"@"+xmpp.JidStr, message) + } +} + + +func gatewaySteamXmppPresence() { + for { + // name := steam.ChanPresence + steamId := <- steam.ChanPresence + stat := <- steam.ChanPresenceSteam + + var status string + var tpye string + switch stat { + case steam.State_Offline: + status = xmpp.Status_offline + tpye = xmpp.Type_unavailable + + case steam.State_Online: + status = xmpp.Status_online + tpye = xmpp.Type_available + + case steam.State_Busy: + status = xmpp.Status_do_not_disturb + tpye = xmpp.Type_available + + case steam.State_Away: + status = xmpp.Status_away + tpye = xmpp.Type_available + + case steam.State_Snooze: + status = xmpp.Status_extended_away + tpye = xmpp.Type_available + } + + xmpp.SendPresenceFrom(status, tpye, steamId+"@"+xmpp.JidStr) + } +} +// /Steam -> XMPP gateways + + + + + +func inputStop() { + for { + in := bufio.NewReader(os.Stdin) + line, err := in.ReadString('\n') + if err != nil { + continue + } + line = strings.TrimRight(line, "\n") + + if line == "stop" { + return + } + } +} diff --git a/servers.addr b/servers.addr new file mode 100644 index 0000000..0bd7b4b --- /dev/null +++ b/servers.addr @@ -0,0 +1 @@ +{"Addresses":[{"IP":"185.25.180.14","Port":27019},{"IP":"185.25.180.15","Port":27020},{"IP":"155.133.242.8","Port":27019},{"IP":"185.25.180.14","Port":27018},{"IP":"185.25.180.15","Port":27018},{"IP":"185.25.180.14","Port":27020},{"IP":"155.133.242.8","Port":27018},{"IP":"155.133.242.8","Port":27020},{"IP":"162.254.197.40","Port":27017},{"IP":"185.25.180.15","Port":27019},{"IP":"155.133.242.8","Port":27017},{"IP":"155.133.242.9","Port":27018},{"IP":"155.133.242.9","Port":27020},{"IP":"155.133.242.9","Port":27019},{"IP":"162.254.197.42","Port":27019},{"IP":"162.254.197.40","Port":27019},{"IP":"185.25.180.15","Port":27017},{"IP":"162.254.197.40","Port":27021},{"IP":"155.133.242.9","Port":27017},{"IP":"185.25.180.14","Port":27017},{"IP":"162.254.197.42","Port":27017},{"IP":"162.254.197.42","Port":27020},{"IP":"162.254.197.41","Port":27017},{"IP":"162.254.197.40","Port":27020},{"IP":"162.254.196.42","Port":27020},{"IP":"162.254.197.40","Port":27018},{"IP":"162.254.197.42","Port":27018},{"IP":"162.254.197.42","Port":27021},{"IP":"162.254.197.41","Port":27019},{"IP":"162.254.196.42","Port":27021},{"IP":"162.254.196.41","Port":27021},{"IP":"162.254.196.42","Port":27019},{"IP":"162.254.197.41","Port":27018},{"IP":"162.254.196.42","Port":27018},{"IP":"162.254.197.41","Port":27021},{"IP":"162.254.196.41","Port":27019},{"IP":"162.254.196.43","Port":27020},{"IP":"162.254.197.41","Port":27020},{"IP":"162.254.196.43","Port":27018},{"IP":"162.254.196.43","Port":27021},{"IP":"162.254.196.40","Port":27019},{"IP":"162.254.196.41","Port":27018},{"IP":"146.66.152.10","Port":27019},{"IP":"162.254.196.42","Port":27017},{"IP":"162.254.196.43","Port":27017},{"IP":"162.254.196.40","Port":27021},{"IP":"162.254.196.41","Port":27020},{"IP":"162.254.196.40","Port":27020},{"IP":"146.66.152.11","Port":27019},{"IP":"162.254.196.40","Port":27017},{"IP":"162.254.196.40","Port":27018},{"IP":"146.66.152.10","Port":27018},{"IP":"146.66.152.11","Port":27020},{"IP":"162.254.196.41","Port":27017},{"IP":"162.254.196.43","Port":27019},{"IP":"146.66.152.11","Port":27017},{"IP":"146.66.152.10","Port":27020},{"IP":"146.66.152.10","Port":27017},{"IP":"146.66.152.11","Port":27018},{"IP":"146.66.155.8","Port":27018},{"IP":"146.66.155.8","Port":27019},{"IP":"185.25.182.10","Port":27020},{"IP":"185.25.182.10","Port":27018},{"IP":"146.66.155.8","Port":27020},{"IP":"185.25.182.10","Port":27019},{"IP":"146.66.155.8","Port":27017},{"IP":"185.25.182.10","Port":27017},{"IP":"208.78.164.13","Port":27019},{"IP":"208.78.164.11","Port":27017},{"IP":"208.78.164.13","Port":27018},{"IP":"208.78.164.14","Port":27018},{"IP":"208.78.164.12","Port":27019},{"IP":"208.78.164.12","Port":27018},{"IP":"208.78.164.11","Port":27018},{"IP":"208.78.164.13","Port":27017},{"IP":"208.78.164.11","Port":27019},{"IP":"208.78.164.10","Port":27017},{"IP":"208.78.164.12","Port":27017},{"IP":"208.78.164.10","Port":27019},{"IP":"208.78.164.9","Port":27019}]} \ No newline at end of file diff --git a/steam/steam.go b/steam/steam.go new file mode 100644 index 0000000..f47d4a9 --- /dev/null +++ b/steam/steam.go @@ -0,0 +1,218 @@ +package steam + +import ( + "github.com/Philipp15b/go-steam" + "github.com/Philipp15b/go-steam/internal/steamlang" + "github.com/Philipp15b/go-steam/steamid" + + "encoding/json" + "io/ioutil" + "strconv" + "time" + "log" +) + +const ( + sentryFile = "sentry" + serverAddrs = "servers.addr" + + State_Offline = steamlang.EPersonaState_Offline + State_Online = steamlang.EPersonaState_Online + State_Busy = steamlang.EPersonaState_Busy + State_Away = steamlang.EPersonaState_Away + State_Snooze = steamlang.EPersonaState_Snooze + State_LookingToTrade = steamlang.EPersonaState_LookingToTrade + State_LookingToPlay = steamlang.EPersonaState_LookingToPlay + State_Max = steamlang.EPersonaState_Max + + ActionConnected = "steam_connected" + ActionDisconnected = "steam_disconnected" + + LogInfo = "\t[STEAM INFO]\t" + LogError = "\t[STEAM ERROR]\t" + LogDebug = "\t[STEAM DEBUG]\t" +) + +var ( + Username = "" + Password = "" + AuthCode = "" + + myLoginInfo = new(steam.LogOnDetails) + client = steam.NewClient() + + ChanPresence = make(chan string) + ChanPresenceSteam = make(chan steamlang.EPersonaState) + ChanMessage = make(chan string) + ChanAction = make(chan string) +) + +func init() { + var sentryHash steam.SentryHash + sentryHash, err := ioutil.ReadFile(sentryFile) + + myLoginInfo.Username = Username + myLoginInfo.Password = Password + + // TODO think again + if err == nil { + myLoginInfo.SentryFileHash = sentryHash + log.Printf("%sAuthentification by SentryFileHash", LogDebug) + } else if AuthCode != "" { + myLoginInfo.AuthCode = AuthCode + log.Printf("%sAuthentification by AuthCode", LogDebug) + } else { + log.Printf("%sFirst authentification", LogDebug) + } +} + + +func Run() { + log.Printf("%sRunning", LogInfo) + client = steam.NewClient() + client.ConnectionTimeout = 10 * time.Second + + mainSteam() +} + +func mainSteam() { + for event := range client.Events() { + switch e := event.(type) { + case *steam.ConnectedEvent: + client.Auth.LogOn(myLoginInfo) + + case *steam.MachineAuthUpdateEvent: + ioutil.WriteFile(sentryFile, e.Hash, 0666) + + case *steam.LoggedOnEvent: + SendPresence(steamlang.EPersonaState_Online) + ChanAction <- ActionConnected + + case steam.FatalErrorEvent: + log.Printf("%sFatalError: ", LogError, e) + ChanAction <- ActionDisconnected + // Re run Steam + go func() { + time.Sleep(2 * time.Second) + Run() + }() + return + + case error: + log.Printf("%s", LogError, e) + + case *steam.ClientCMListEvent: + // Save servers addresses + b, err := json.Marshal(*e) + if err != nil { + log.Printf("%sFailed to json.Marshal() servers list", LogError) + } + ioutil.WriteFile(serverAddrs, b, 0666) + + case *steam.PersonaStateEvent: + // ChanPresence <- e.Name + ChanPresence <- e.FriendId.ToString() + ChanPresenceSteam <- e.State + + case *steam.ChatMsgEvent: + ChanMessage <- e.ChatterId.ToString() + ChanMessage <- e.Message + + default: + log.Printf("%s", LogDebug, e) + } + } +} + +func IsConnected() bool { + return client.Connected() +} + +func Connect() { + b, err := ioutil.ReadFile(serverAddrs) + if err == nil { + var toList steam.ClientCMListEvent + err := json.Unmarshal(b, &toList) + if err != nil { + log.Printf("%sFailed to json.Unmarshal() servers list", LogError) + } else { + log.Printf("%sConnecting...", LogInfo) + client.ConnectTo(toList.Addresses[0]) + } + } else { + log.Printf("%sFailed to read servers list file", LogError) + client.Connect() + } +} + +func Disconnect() { + log.Printf("%sSteam disconnect", LogInfo) + // TODO XMPP notification ofline from all steam friend + + go client.Disconnect() +} + + +func SendMessage(steamId, message string) { + steamIdUint64, err := strconv.ParseUint(steamId, 10, 64) + if err == nil { + client.Social.SendMessage(steamid.SteamId(steamIdUint64), steamlang.EChatEntryType_ChatMsg, message) + } else { + log.Printf("%sFailed to get SteamId from %s", LogError, steamId) + } +} + +func SendPresence(status steamlang.EPersonaState) { + client.Social.SetPersonaState(status) +} + + + +//------------------------------------------------------------------------------ +// First authentification error +//------------------------------------------------------------------------------ +// 2015/10/17 15:15:29 Steam connected +// SteamID: STEAM_0:0:0 +// 2015/10/17 15:15:30 Steam connected +// FatalErrorEvent +// Login error: EResult_AccountLogonDenied +// &{} +//------------------------------------------------------------------------------ +// Authentificated +//------------------------------------------------------------------------------ +// &{1593367805 SsEgwfLu7Spol4jEzA0} +// &{} +// &{EClientPersonaStateFlag_GameDataBlob | EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_LastSeen | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_QueryPort | EClientPersonaStateFlag_SourceID | EClientPersonaStateFlag_Status STEAM_0:0:6208314 EPersonaState_Online 0 0 0 0 0 65535 STEAM_0:0:0 [] Chteufleur eb267fc00a974dbd2ae7e3c3de06130729cdfcbd 1445087561 1445088090 0 1 1 false 0} +// &{EClientPersonaStateFlag_GameDataBlob | EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_LastSeen | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_QueryPort | EClientPersonaStateFlag_SourceID | EClientPersonaStateFlag_Status STEAM_0:1:23476646 EPersonaState_Online 0 274190 274190 Broforce 0 0 0 STEAM_0:0:0 [] moumoutte 1cebd6410e6ceb02af60d42a34ca355c5b3b41e6 1445034635 1445034642 0 1 1 false 0} +// &{EClientPersonaStateFlag_GameDataBlob | EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_LastSeen | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_QueryPort | EClientPersonaStateFlag_SourceID | EClientPersonaStateFlag_Status STEAM_0:1:22486691 EPersonaState_Online 0 0 0 0 0 65535 STEAM_0:0:0 [] Pimouss 9ed44c8628c419cb9cb184014889063de4146e38 1445078411 1445086045 0 1 1 false 0} +// &{EClientPersonaStateFlag_GameDataBlob | EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_LastSeen | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_QueryPort | EClientPersonaStateFlag_SourceID | EClientPersonaStateFlag_Status STEAM_0:1:20592317 EPersonaState_Online 0 0 0 0 0 65535 STEAM_0:0:0 [] Francis LALAN 9fe3eb4c1b2abf6768df2d41c6343dc69ec27e83 1445042279 1445072749 0 1 1 false 0} +// &{103582791434277245 0 EAccountFlags_PersonaNameSet | EAccountFlags_Unbannable Steam Trading Cards Group 2ce81e0b8f1c748f86d1ca4230a7f45dd0b906b1 1448289 367203 23 124404 [] []} +// &{EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:6208314 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Chteufleur eb267fc00a974dbd2ae7e3c3de06130729cdfcbd 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:6208314 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Chteufleur eb267fc00a974dbd2ae7e3c3de06130729cdfcbd 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:52837827 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] beutard 0000000000000000000000000000000000000000 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID 103582791434277245 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Steam Trading Cards Group 2ce81e0b8f1c748f86d1ca4230a7f45dd0b906b1 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:20592317 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Francis LALAN 9fe3eb4c1b2abf6768df2d41c6343dc69ec27e83 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:23476646 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] moumoutte 1cebd6410e6ceb02af60d42a34ca355c5b3b41e6 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:94714518 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] mimiptitsourie fa0f46837771ec60665889c285f9496d353a50e6 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:18218832 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Milamber 3cfcc21ea34862a3ee9634d36c91391cf73b4af9 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:61725424 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] azer9911 c160d49f7a842f408051bbada040b7d154bbcaf5 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:17516002 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Earenfly 52d70ad89eab9bf4f64f25509ac80a8081b0c0d6 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:20054215 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Wurrzounet 257038af8628ded724c8c8af072c678aadf3c72c 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:45567500 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] johann.gautier.fr bcc9b911486843390af223b8e7cb6d931e9b7e75 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:22486691 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Pimouss 9ed44c8628c419cb9cb184014889063de4146e38 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:45984569 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Sl@ny aa4bf32f5fc568c7949bf88c3c569c452edfcdf6 0 0 0 0 0 false 0} +// &{EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:1:19128186 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] pouzetalexis 0000000000000000000000000000000000000000 0 0 0 0 0 false 0} +// &{Chteufleur SE [] [] 38 false EAccountFlags_EmailValidated | EAccountFlags_HWIDSet | EAccountFlags_LogonExtraSecurity | EAccountFlags_PasswordSet | EAccountFlags_PersonaNameSet | EAccountFlags_Steam2MigrationComplete 0 } +// &{EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID STEAM_0:0:6208314 EPersonaState_Offline 0 0 0 0 0 0 STEAM_0:0:0 [] Chteufleur eb267fc00a974dbd2ae7e3c3de06130729cdfcbd 0 0 0 0 0 false 0} +// +// +// +// +// +// &{STEAM_0:0:0 STEAM_0:1:22486691 EChatEntryType_Typing} +// &{STEAM_0:0:0 STEAM_0:1:22486691 bouh EChatEntryType_ChatMsg} +// &{EClientPersonaStateFlag_GameDataBlob | EClientPersonaStateFlag_GameExtraInfo | EClientPersonaStateFlag_LastSeen | EClientPersonaStateFlag_PlayerName | EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_QueryPort | EClientPersonaStateFlag_SourceID | EClientPersonaStateFlag_Status STEAM_0:1:23476646 EPersonaState_Away 0 274190 274190 Broforce 0 0 0 STEAM_0:0:0 [] moumoutte 1cebd6410e6ceb02af60d42a34ca355c5b3b41e6 1445034635 1445034642 0 1 1 false 0} +//------------------------------------------------------------------------------ +// Servers list +//------------------------------------------------------------------------------ +// 2015/10/18 11:43:49 [STEAM DEBUG] %!(EXTRA *steam.ClientCMListEvent=&{[185.25.180.14:27019 155.133.242.8:27019 185.25.180.15:27019 155.133.242.9:27017 185.25.180.15:27017 185.25.180.14:27018 155.133.242.9:27020 185.25.180.14:27017 185.25.180.15:27018 155.133.242.9:27019 155.133.242.8:27018 162.254.197.41:27020 162.254.197.41:27021 162.254.197.41:27017 162.254.197.42:27018 162.254.197.40:27019 185.25.180.14:27020 185.25.180.15:27020 162.254.197.42:27020 162.254.197.41:27018 155.133.242.9:27018 162.254.197.42:27017 162.254.197.42:27021 155.133.242.8:27020 162.254.197.42:27019 162.254.197.40:27017 162.254.197.40:27021 162.254.197.40:27020 155.133.242.8:27017 162.254.197.41:27019 162.254.197.40:27018 162.254.196.42:27019 162.254.196.42:27021 162.254.196.40:27017 162.254.196.42:27017 162.254.196.43:27021 162.254.196.41:27019 162.254.196.43:27017 162.254.196.41:27020 162.254.196.41:27021 162.254.196.43:27020 162.254.196.42:27018 162.254.196.41:27018 162.254.196.43:27019 162.254.196.42:27020 162.254.196.40:27018 162.254.196.40:27021 162.254.196.40:27020 162.254.196.43:27018 162.254.196.40:27019 162.254.196.41:27017 146.66.152.10:27019 146.66.152.11:27018 146.66.152.10:27018 146.66.152.11:27019 146.66.152.11:27017 146.66.152.10:27017 146.66.152.10:27020 146.66.152.11:27020 185.25.182.10:27019 185.25.182.10:27020 146.66.155.8:27019 185.25.182.10:27017 185.25.182.10:27018 146.66.155.8:27017 146.66.155.8:27020 146.66.155.8:27018 208.78.164.13:27018 208.78.164.10:27018 208.78.164.12:27018 208.78.164.10:27019 208.78.164.12:27019 208.78.164.9:27019 208.78.164.11:27019 208.78.164.14:27018 208.78.164.13:27019 208.78.164.11:27018 208.78.164.9:27018 208.78.164.13:27017 208.78.164.10:27017]}) diff --git a/xmpp/xmpp.go b/xmpp/xmpp.go new file mode 100644 index 0000000..33ae1c5 --- /dev/null +++ b/xmpp/xmpp.go @@ -0,0 +1,114 @@ +package xmpp + + +import ( + // "github.com/emgee/go-xmpp" + "go-xmpp" + + "log" + "strings" +) + +const ( + Status_online = "" + Status_offline = "" + Status_away = "away" + Status_chat = "chat" + Status_do_not_disturb = "dnd" + Status_extended_away = "xa" + + Type_available = "" + Type_unavailable = "unavailable" + + ActionConnexion = "action_xmpp_connexion" + ActionDeconnexion = "action_xmpp_deconnexion" + + LogInfo = "\t[XMPP INFO]\t" + LogError = "\t[XMPP ERROR]\t" + LogDebug = "\t[XMPP DEBUG]\t" +) + +var ( + Addr = "127.0.0.1:5347" + JidStr = "" + Secret = "" + + PreferedJID = "" + + jid xmpp.JID + stream = new(xmpp.Stream) + comp = new(xmpp.XMPP) + + ChanPresence = make(chan string) + ChanMessage = make(chan string) + ChanAction = make(chan string) + + CurrentStatus = Status_offline +) + + +func Run() { + log.Printf("%sRunning", LogInfo) + // Create stream and configure it as a component connection. + jid = must(xmpp.ParseJID(JidStr)).(xmpp.JID) + stream = must(xmpp.NewStream(Addr, &xmpp.StreamConfig{LogStanzas: true})).(*xmpp.Stream) + comp = must(xmpp.NewComponentXMPP(stream, jid, Secret)).(*xmpp.XMPP) + + SendPresence(Status_online, Type_available) + + mainXMPP() +} + +func mainXMPP() { + for x := range comp.In { + switch v := x.(type) { + case *xmpp.Presence: + if strings.SplitN(v.From, "/", 2)[0] == PreferedJID && v.To == JidStr { + if v.Type == Type_unavailable { + Disconnect() + ChanAction <- ActionDeconnexion + } else { + // SendPresence(v.Show, v.Type) + CurrentStatus = v.Show + ChanAction <- ActionConnexion + } + + ChanPresence <- v.Show + } + + case *xmpp.Message: + steamID := strings.SplitN(v.To, "@", 2)[0] + ChanMessage <- steamID + ChanMessage <- v.Body + + default: + log.Printf("%srecv: %v", LogDebug, x) + } + } + + // Send deconnexion + SendPresence(Status_offline, Type_unavailable) +} + +func must(v interface{}, err error) interface{} { + if err != nil { + log.Fatal(LogError, err) + } + return v +} + +func Disconnect() { + SendPresence(Status_offline, Type_unavailable) +} + +func SendPresence(status, tpye string) { + comp.Out <- xmpp.Presence{To: PreferedJID, From: jid.Domain, Show: status, Type: tpye} +} + +func SendPresenceFrom(status, tpye, from string) { + comp.Out <- xmpp.Presence{To: PreferedJID, From: from, Show: status, Type: tpye} +} + +func SendMessage(from, message string) { + comp.Out <- xmpp.Message{To: PreferedJID, From: from, Body: message} +} diff --git a/xmpp4steam.cfg b/xmpp4steam.cfg new file mode 100644 index 0000000..666da00 --- /dev/null +++ b/xmpp4steam.cfg @@ -0,0 +1,12 @@ +# XMPP informations +xmpp_server_address=192.168.1.2 +xmpp_server_port=5347 +xmpp_hostname=steam.kingpenguin.tk +xmpp_secret=steam_gateway_password +xmpp_authorized_jid=chteufleur@kingpenguin.tk + +# Steam informations +steam_login=toto +steam_password=toto_password123$ +# steam_auth_code must be blank the first time. Then Valve will send the auth code to give here. +steam_auth_code=CXD7J