diff --git a/cmd/cgr-mediator/cgr-mediator.go b/cmd/cgr-mediator/cgr-mediator.go index e169a410c..7aeec7226 100644 --- a/cmd/cgr-mediator/cgr-mediator.go +++ b/cmd/cgr-mediator/cgr-mediator.go @@ -74,6 +74,8 @@ func main() { } for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { uuid := record[10] + t, _ := time.Parse("2012-05-21 17:48:20", record[5]) + fmt.Println(t) if useDB { cc, timespansText, err := readDbRecord(db, uuid) if err != nil && useRPC { @@ -92,7 +94,8 @@ func main() { TimeEnd: t2} client.Call("Responder.GetCost", cd, cc) } - log.Print(cc, timespansText) + _ = timespansText + //log.Print(cc, timespansText) } } } diff --git a/sessionmanager/sessiondelegate.go b/sessionmanager/sessiondelegate.go index 9a65c3e62..4e0333e4e 100644 --- a/sessionmanager/sessiondelegate.go +++ b/sessionmanager/sessiondelegate.go @@ -21,6 +21,8 @@ package sessionmanager import ( "github.com/rif/cgrates/timespans" "log" + "net/rpc" + "net/rpc/jsonrpc" "time" ) @@ -149,7 +151,17 @@ func (dsd *DirectSessionDelegate) GetDebitPeriod() time.Duration { } // Sample SessionDelegate calling the timespans methods through the RPC interface -type RPCSessionDelegate byte +type RPCSessionDelegate struct { + client *rpc.Client +} + +func NewRPCSessionDelegate(host string) (rpc *RPCSessionDelegate) { + client, err := jsonrpc.Dial("tcp", host) + if err != nil { + log.Fatalf("Could not connect to rater server %v!", err) + } + return &RPCSessionDelegate{client} +} func (rsd *RPCSessionDelegate) OnHeartBeat(ev Event) { log.Print("rpc hearbeat") @@ -164,9 +176,34 @@ func (rsd *RPCSessionDelegate) OnChannelHangupComplete(ev Event, s *Session) { } func (rsd *RPCSessionDelegate) LoopAction(s *Session, cd *timespans.CallDescriptor) { - log.Print("Rpc debit") + cc := ×pans.CallCost{} + err := rsd.client.Call("Responder.Debit", cd, cc) + if err != nil { + log.Printf("Could not complete debit opperation: %v", err) + } + s.CallCosts = append(s.CallCosts, cc) + log.Print(cc) + cd.Amount = DEBIT_PERIOD.Seconds() + var remainingSeconds float64 + err = rsd.client.Call("Responder.GetMaxSessionTime", cd, &remainingSeconds) + if err != nil { + log.Printf("Could not get max session time: %v", err) + } + if remainingSeconds == -1 && err == nil { + log.Print("Postpaying client: happy talking!") + return + } + if remainingSeconds == 0 || err != nil { + log.Printf("No credit left: Disconnect %v", s) + s.Disconnect() + return + } + if remainingSeconds < DEBIT_PERIOD.Seconds() || err != nil { + log.Printf("Not enough money for another debit period %v", s) + s.Disconnect() + return + } } - func (rsd *RPCSessionDelegate) GetDebitPeriod() time.Duration { return DEBIT_PERIOD }